【发布时间】:2010-12-10 10:57:22
【问题描述】:
我经常在源代码中看到使用 if (object.ReferenceEquals(myObject, null)) 来检查 myObject 是否为 null 而不是 if (myObject == null)我熟悉的strong>。
是否有任何特殊原因(如速度、可读性等)使用第一种方式而不是第二种方式?你用的是哪一种?
提前谢谢你。
【问题讨论】:
我经常在源代码中看到使用 if (object.ReferenceEquals(myObject, null)) 来检查 myObject 是否为 null 而不是 if (myObject == null)我熟悉的strong>。
是否有任何特殊原因(如速度、可读性等)使用第一种方式而不是第二种方式?你用的是哪一种?
提前谢谢你。
【问题讨论】:
使用ReferenceEquals 时,请确保没有应用特殊处理(例如重载运算符)。如果与未绑定的泛型一起使用,这也会导致不同的结果。
【讨论】:
简单的事情通常是最有效的:
(myObject == null) 性能更高
看this的文章
【讨论】:
(object) myObj == null 和 ReferenceEquals 没有区别。然而,你在这篇文章中的建议(7 年前)是非常危险的(如链接文章中所解释的),当然应该不在没有演员表的情况下使用(除非你真的想使用可能的重载,但随后“性能”与它无关)。
【讨论】:
ReferenceEquals。
== 运算符可以被类实现重载,因此它可能不会进行引用比较(尽管它可能应该与nulls 进行比较)。 object.ReferenceEquals 不能,所以它总是可靠地进行参考比较。
干杯 马蒂亚斯
【讨论】:
ReferenceEquals 方法不能被覆盖,因此您始终可以确定比较将比较对象引用,而不是传递给 Equals 方法的某些覆盖。
【讨论】:
它们通常具有相同的效果,尽管它们编译成不同的东西。 if (myObject == null) 产生 ceq 操作码,我希望它可以编译成更快的代码。 object.ReferenceEquals 是一个和其他方法一样的方法调用。
当myObject 具有operator= 方法时,它们是不同的;当它存在时,您的代码会调用此方法而不是使用ceq。然后operator= 可以为所欲为。
除非你有理由不这样做,否则总是if (myObject == null)。
【讨论】:
obj1==obj2,所以我希望性能与 == 完全相同,但它将参数转换为对象,因此任何重载的 == 运算符都不会影响它。