C# 为什么Equals(null)在对象数组null检查中失败
我有一个对象数组,如下所示:C# 为什么Equals(null)在对象数组null检查中失败,c#,object,null,comparison,C#,Object,Null,Comparison,我有一个对象数组,如下所示: private object[] _yazdirmaBilgisi = new object[5]; 在某些情况下,我想访问第一个元素,但当然我想先检查它是否为null 在某些点上[0]为空,但[1]不为空 当我使用Equals检查值是否为null时,它会引发异常: if (!_yazdirmaBilgisi[0].Equals(null)) //Throws exception 但是如果我检查=空ne异常 if (_yazdirmaBilgisi[0] !=
private object[] _yazdirmaBilgisi = new object[5];
在某些情况下,我想访问第一个元素,但当然我想先检查它是否为null
在某些点上[0]为空,但[1]不为空
当我使用Equals
检查值是否为null时,它会引发异常:
if (!_yazdirmaBilgisi[0].Equals(null)) //Throws exception
但是如果我检查=代码>空ne异常
if (_yazdirmaBilgisi[0] != null) // No exception
为什么不同?
为什么等于(null)
抛出异常,但!=null
不会第一个抛出,因为列表中的第一个元素是null引用。这就是您的代码所做的:
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
这一行:
if (!_yazdirmaBilgisi[0].Equals(null))
从\u yazdirmaBilgisi[0]
将该引用用作调用.Equals()
的对象
但由于该引用是null
,因此它会抛出NullReferenceException
鉴于:
if (_yazdirmaBilgisi[0] != null)
直接将\u yazdirmaBilgisi[0]
中的引用与null进行比较,因此不会引发异常-它不会尝试调用被引用对象的任何方法。因为==null
与.Equals(null)
不同。如果使用Equals
,显然会因为尝试访问空引用而出现异常=
的工作原理不同,类似于对象。Equals(a,b)
首先检查两个值是否为null,然后进行更多比较。\u yazdirmaBilgisi[0]。Equals
表示您正在尝试调用实例方法Equals
,因为\u yazdirmaBilgisi[0]
为null,您将得到NRE@Habib即使很短,您可以将其作为答案发布^^^,它会引发什么异常?所以你可以回答你自己的问题。请说清楚,我们必须猜测你的代码有什么问题才能回答。@PatrickHofman我想他不是说他的代码有什么问题,他只是问为什么两种不同的检查产生不同的结果。看起来更像是一个新手问题。==运算符被重载了,这样做是有误导性的。@SriramSakthivel我删除了重载这个词,但在其他方面它是如何误导的?现在没问题了。不仅重载这个词有误导性,而且你说做object.Equals是重载的,这是错误的。后来您将其更改为ReferenceEquals
@SriramSakthivel我也不确定我是否喜欢ReferenceEquals(这就是为什么我说我的代码类似)。在这个问题中,他显式地使用System.Objects,但字符串确实定义了==运算符,这比我的示例要复杂一些。