C# - 这是否必要“obj is Person&& obj!= null”

时间:2011-05-05 16:52:55

标签: c#

我看到了以下代码,

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

4 个答案:

答案 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 == nullmyClassInstance as OtherClass == null,因此只需检查一下安全播放对象,您就确认了这两个条件,正如他所说,从那时起,您就有了一个强类型的引用。< / p>

有一个有趣的讨论,isas关键字操作之间的差异很小。谷歌“现状是还是现在”(我目前遇到互联网问题)。事实证明它们在IL级别上工作非常相似。