我看到了下面的代码,C# - 这是检查有必要“obj是人&& OBJ!= NULL”
public override bool Equals(object obj)
{
// From the book http://www.amazon.co.uk/Pro-2010-NET-4-0-Platform/dp/1430225491
// Page 254!
if (obj is Person && obj != null)
...
}
根据我的理解,我认为该代码应被重写如下:
public override bool Equals(object obj)
{
if (obj is Person)
...
}
这是正确的吗?
基于http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx
An是表达式评估为真,如果所提供的表达为非空,并且所提供的对象可以被强制转换为提供的类型而不会导致抛出异常。
我认为额外检查null是没有必要的。换句话说,该代码“obj!= null”根本不应该被打中。
谢谢
// //更新
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Employee
{
public static void CheckIsEmployee(object obj)
{
if (obj is Employee)
{
Console.WriteLine("this is an employee");
}
else if (obj == null)
{
Console.WriteLine("this is null");
}
else
{
Console.WriteLine("this is Not an employee");
}
}
}
class NotEmployee
{ }
class Program
{
static void Main(string[] args)
{
Employee e = new Employee();
Employee.CheckIsEmployee(e);
Employee f = null;
Employee.CheckIsEmployee(f);
NotEmployee g = new NotEmployee();
Employee.CheckIsEmployee(g);
}
}
}
输出结果:
this is an employee
this is null
this is Not an employee
取决于'is'的定义是什么;-)在.NET的情况下,as'在内部执行'is'并且如果'is'为false,则将结果设置为'null'。如果有时可能会出现'null',jlew的解决方案会更加优化。 – 2011-05-05 17:01:25
@Eric J:D.使用'as'的原因主要是稍后使用类型化实例。因此,在jlew的解决方案中,你可能(可能)需要在确定它不是null之后将'obj'作为'Person'来投射,这样你才能完成Equals评估的其余部分。保存相同结果的一行或两行代码。 – Thomas 2011-05-05 17:08:08