c#——这个检查是必要的吗?对象是人&&Obj != null"
本文关键字:Obj quot null 对象 检查 | 更新日期: 2023-09-27 17:54:51
我看到了下面的代码,
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
如果提供的表达式非空,则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
我倾向于使用as
关键字。
public override bool Equals(object obj)
{
var objectToCompare = obj as Person;
if ( objectToCompare == null )
return false;
...
}
优点是,在方法的后面,您有一个类型化实例(objectToCompare)来进行比较。
您的评估是正确的,如果obj不是从Person派生的,或者如果obj为null,因此obj is Person && obj != null
是多余的,obj is Person
将返回false;如果您使用该样式,则只需要obj is Person
。从技术上讲,首先检查null可能会有一定程度的性能增益,但增益可以忽略不计。
从功能上讲是正确的,但是检查null比执行运行时类型检查更快,因此在大多数情况下最好先检查null。这样,如果obj 为 null,则不会产生运行时类型检查的开销。
你的版本看起来更正确。除非它是非null,否则它不会是Person,所以obj != null是多余的。
对Person的引用仍然可以是空引用,所以从技术上讲,这两项检查都是必需的。
我喜欢托马斯关于如何同时处理两张支票的回答。null as MyClass == null
和myClassInstance as OtherClass == null
,因此通过对安全强制转换对象的一次检查,您已经确认了这两个条件,并且正如他所说,从那时起您就有了一个强类型引用可以使用。
关于is
和as
关键字操作在低级别的区别有一个有趣的讨论。谷歌"Is as Is or Is Is as"(我现在上网有问题)。事实证明,它们在IL水平上的作用非常相似。