检查对象是否为空的最佳和最快的方法

问题描述:

我经常在源代码中看到if(object.ReferenceEquals(myObject,null))用于检查myObject是否为空而不是if(myObject == null)我很熟悉。检查对象是否为空的最佳和最快的方法

是否有任何特殊的原因(如速度,可读性等)使用第一种方式而不是第二种?你使用哪一个?

预先感谢您。

使用ReferenceEquals时,请确保没有进行特殊处理(例如重载操作符)。如果使用未绑定的泛型,这也会导致不同的结果。

+0

那篇文章已经过时了,说到错误的结论。在.NET 4.0及以上版本中,这两种方法的IL完全相同。您可以通过尝试使用该文章中的示例轻松看到这一点。为了可读性,我会建议'ReferenceEquals'。 – Abel 2017-11-19 01:46:54

==操作员可以通过类实现重载,所以它可能不是做参考对比(虽然它可能应该与null S)。 object.ReferenceEquals不能,所以它可靠总是做一个参考比较。

干杯 马蒂亚斯

该方法的ReferenceEquals不能被覆盖,所以你总是可以肯定的是,比较会比较的对象引用,而不是被传递给equals方法的一些覆盖。

简单的事情通常是最有效的: (myObject == null)更高性能

this文章

+0

引用的文章,虽然看似有趣的阅读,但面向.NET 2.0。在.NET 4.0出现一段时间的时候,使用'(object)myObj == null'和'ReferenceEquals'没有区别。然而,你在这篇文章中的建议(7年前)非常危险(正如链接文章中所解释的),并且当然不应该在没有演员的情况下使用(除非你真的想要使用可能的超载,但是“高性能“与它无关)。 – Abel 2017-11-19 01:44:32

他们通常有同样的效果,虽然它们编译成不同的东西。 if (myObject == null)结果为ceq操作码,我希望这个操作码可以编译为更快的代码。 object.ReferenceEquals是一个像其他任何方法调用。

myObjectoperator=方法时它们不同;当存在时,您的代码会调用此方法而不是使用ceqoperator=然后可以做任何喜欢的事情。除非你有理由不这样做,否则总是if (myObject == null)

+0

仅仅因为它是IL中的一个方法调用,并不意味着这是一个抖动完成后的方法调用。参考等于很短,所以很可能被内联。它的内容只是'obj1 == obj2',所以我期望与==完全相同的性能,但是它将参数转换为对象,所以任何重载的==运算符都不会影响它。 – CodesInChaos 2010-12-10 11:14:14

+0

它不是像任何其他的“方法调用”,编译时,IL将不会调用它,而是使用特殊的IL代码,这两种方法都是相同的(自.NET 4.0起)。 @CodesInChaos是正确的,它是完全一样的性能(和IL)。 – Abel 2017-11-19 01:49:55