Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查对象是否为空的最佳和最快方法_C#_.net - Fatal编程技术网

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

C# 检查对象是否为空的最佳和最快方法,c#,.net,C#,.net,我经常在源代码中看到使用if(object.ReferenceEquals(myObject,null))来检查myObject是否为null,而不是我熟悉的if(myObject==null) 使用第一种方法而不是第二种方法有什么特别的原因(比如速度、可读性等)?你用哪一种 提前感谢。使用ReferenceEquals时,请确保未应用任何特殊处理(例如重载运算符)。如果与非绑定泛型一起使用,这也会导致不同的结果。看看这篇有趣的文章 类实现可能会重载=运算符,因此它可能不会进行引用比较(尽管它可

我经常在源代码中看到使用if(object.ReferenceEquals(myObject,null))来检查myObject是否为null,而不是我熟悉的if(myObject==null)

使用第一种方法而不是第二种方法有什么特别的原因(比如速度、可读性等)?你用哪一种


提前感谢。

使用
ReferenceEquals
时,请确保未应用任何特殊处理(例如重载运算符)。如果与非绑定泛型一起使用,这也会导致不同的结果。

看看这篇有趣的文章


类实现可能会重载
=
运算符,因此它可能不会进行引用比较(尽管它可能应该与
null
s进行比较)<代码>对象。ReferenceEquals不能,因此它总是可靠地进行引用比较

干杯
Matthias

ReferenceEquals方法不能被重写,因此您可以始终确定比较将比较对象引用,而不是传递给Equals方法的某些重写。

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


看看这篇文章,它们通常有相同的效果,尽管它们编译成不同的东西
if(myObject==null)
生成一个
ceq
操作码,我希望编译成更快的代码
object.ReferenceEquals
与其他方法一样是一个方法调用

myObject
具有
操作符=
方法时,它们是不同的;当出现这种情况时,您的代码将调用此方法,而不是使用
ceq
operator=
然后就可以随心所欲了


始终
if(myObject==null)
,除非您有理由不这样做。

仅仅因为它是IL中的方法调用并不意味着抖动完成后它就是方法调用。Reference equals非常短,因此很可能是内联的。它的内容只是
obj1==obj2
,所以我希望它的性能与==完全相同,但它将参数强制转换为object,因此任何重载==运算符都不会影响它。它不是“像任何其他方法一样的方法调用”,在编译时,IL中不会包含该方法调用,而是使用特殊的IL代码,它们是相等的(因为.NET 4.0)对这两种方法都适用。@CodesInChaos是正确的,它的性能(和IL)完全相同。引用的文章虽然看起来很有趣,但针对的是.NET 2.0。在.NET 4.0推出一段时间后,在其中使用
(object)没有区别myObj==null
ReferenceEquals
。然而,你在这篇文章中的建议(7年前)是非常危险的(正如链接文章中所解释的),当然不应该在没有强制转换的情况下使用(除非你真的想使用可能的重载,但是“performant”与此无关).那篇文章过时了,得出了错误的结论。对于.NET 4.0及更高版本中的两种方法,IL完全相同。您可以通过尝试那篇文章中的示例轻松看出这一点。为了便于阅读,我建议
ReferenceEquals