【问题标题】:Best and fastest way to check if an object is null [duplicate]检查对象是否为空的最佳和最快方法[重复]
【发布时间】:2010-12-10 10:57:22
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      this的文章

      【讨论】:

      • 引用的文章,虽然看起来很有趣,但目标是 .NET 2.0。当时 .NET 4.0 已经发布了一段时间,在其中,使用 (object) myObj == nullReferenceEquals 没有区别。然而,你在这篇文章中的建议(7 年前)是非常危险的(如链接文章中所解释的),当然应该在没有演员表的情况下使用(除非你真的想使用可能的重载,但随后“性能”与它无关)。
      【解决方案3】:

      【讨论】:

      • 那篇文章已经过时了,它得出了错误的结论。对于 .NET 4.0 及更高版本中的两种方法,IL 完全相同。通过尝试该文章中的示例,您可以轻松地看到这一点。为了可读性,我建议ReferenceEquals
      【解决方案4】:

      == 运算符可以被类实现重载,因此它可能不会进行引用比较(尽管它可能应该与nulls 进行比较)。 object.ReferenceEquals 不能,所以它总是可靠地进行参考比较。

      干杯 马蒂亚斯

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          myObject 具有operator= 方法时,它们是不同的;当它存在时,您的代码会调用此方法而不是使用ceq。然后operator= 可以为所欲为。

          除非你有理由不这样做,否则总是if (myObject == null)

          【讨论】:

          • 仅仅因为它是 IL 中的方法调用并不意味着它是在抖动完成后的方法调用。引用 equals 很短,所以很可能是内联的。它的内容只是obj1==obj2,所以我希望性能与 == 完全相同,但它将参数转换为对象,因此任何重载的 == 运算符都不会影响它。
          • 不是“像任何其他方法调用一样”,编译时,IL 将在其中包含该方法调用,而是特殊的使用 IL 代码,这两种方法都是相同的(从 .NET 4.0 开始)。 @CodesInChaos 是对的,它的性能(和 IL)完全相同。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-17
          • 1970-01-01
          • 1970-01-01
          • 2016-08-28
          • 1970-01-01
          • 2020-07-01
          • 2018-04-09
          相关资源
          最近更新 更多