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

c#——这个检查是必要的吗?对象是人&&Obj != null"

我倾向于使用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 == nullmyClassInstance as OtherClass == null,因此通过对安全强制转换对象的一次检查,您已经确认了这两个条件,并且正如他所说,从那时起您就有了一个强类型引用可以使用。

关于isas关键字操作在低级别的区别有一个有趣的讨论。谷歌"Is as Is or Is Is as"(我现在上网有问题)。事实证明,它们在IL水平上的作用非常相似。