为什么Equals(null)在对象数组null检查时失败

时间:2014-11-13 14:49:53

标签: c# object null comparison

我有一个对象数组如下:

private object[] _yazdirmaBilgisi = new object[5];

在某些方面我想访问第一个元素但当然我想检查它是否为空

在某些时候[0]为空但[1]不为空。

当我使用Equals检查值是否为空时,它会抛出异常:

if (!_yazdirmaBilgisi[0].Equals(null))  //Throws exception

但如果我查看!= null ne exception

if (_yazdirmaBilgisi[0] != null) // No exception

为什么会有所不同? 为什么Equals(null)会抛出异常,但!= null不会

3 个答案:

答案 0 :(得分:3)

因为== null.Equals(null)不同。如果使用Equals,显然会因尝试访问空引用而出现异常。 ==的工作方式不同,类似于Object.Equals(a,b),因为它会先检查两个值是否为空,然后进行更多比较。

答案 1 :(得分:1)

第一次抛出因为列表中的第一个元素是空引用。这就是您的代码正在做的事情:

var element = _yazdirmaBilgisi[0];
if (element.Equals(null)) // element is null, and null.Equals is calling a method on a null reference

==运算符被定义为执行与此类似的操作:

var element = _yazdirmaBilgisi[0]; // element is reference who's value is null
if (object.ReferenceEquals(element, null)) // object.Equals is a static method which doesn't require an object instance

答案 2 :(得分:1)

这一行:

if (!_yazdirmaBilgisi[0].Equals(null)) 
  1. _yazdirmaBilgisi[0]
  2. 中提取引用
  3. 使用该引用作为调用.Equals()的对象。
  4. 但由于该引用为null,因此会抛出NullReferenceException

    鉴于:

    if (_yazdirmaBilgisi[0] != null)
    

    直接将_yazdirmaBilgisi[0]中的引用与null进行比较,因此它不会抛出异常 - 它不会尝试调用引用对象的任何方法。