我看到了以下代码,
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
如果提供的表达式为非null,则is表达式的计算结果为true,并且可以将提供的对象强制转换为提供的类型,而不会引发异常。
我认为根本不需要额外检查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
答案 0 :(得分:8)
从功能上来说它是正确的,但是检查null比检查运行时类型更快,所以最好在大多数情况下首先检查null。这样,如果obj 为null,则不会产生运行时类型检查的开销。
答案 1 :(得分:8)
我的偏好是使用as
关键字。
public override bool Equals(object obj)
{
var objectToCompare = obj as Person;
if ( objectToCompare == null )
return false;
...
}
优点是在方法的后面,你有一个用于比较的类型化实例(objectToCompare)。
如果obj不是从Person派生的,或者如果obj为空,obj is Person
是多余的,那么obj is Person && obj != null
将返回false是正确的。如果你使用那种风格,你只需要obj is Person
。从技术上讲,通过首先检查null可能会获得一小部分性能增益,但增益可以忽略不计。
答案 2 :(得分:1)
您的版本对我来说更合适。除非它是非空的,否则它不会是一个Person,所以obj!= null是多余的。
答案 3 :(得分:1)
对Person的引用仍然可以是空引用,因此从技术上讲,这两项检查都是必需的。
我喜欢托马斯关于如何同时处理这两项检查的答案。 null as MyClass == null
和myClassInstance as OtherClass == null
,因此只需检查一下安全播放对象,您就确认了这两个条件,正如他所说,从那时起,您就有了一个强类型的引用。< / p>
有一个有趣的讨论,is
和as
关键字操作之间的差异很小。谷歌“现状是还是现在”(我目前遇到互联网问题)。事实证明它们在IL级别上工作非常相似。