【问题标题】:null == object vs object == null [duplicate]null ==对象与对象== null [重复]
【发布时间】:2012-06-26 13:31:34
【问题描述】:

可能重复:
What is wrong in comparing a null with an object rather than an object with a null

我看到一些开发人员在 C# 中使用以下空对象检查:

if (null == myObject)
{

}

而不是:

if (myObject == null)
{

}

我更喜欢第二种说法,因为它(对我来说)从左到右自然地阅读。

为什么要使用第一个有什么理由吗?有任何性能优势,还是纯粹的味道?

【问题讨论】:

  • 没有。我自己更喜欢第二个。
  • 有一个类似的问题很重要。 myString.equals("") 而不是 "".equals(myString);第二个确保您永远不会尝试在空变量上调用函数。 myString 可以为 null 并在第一个崩溃,但 equals(null) 不会导致崩溃
  • 我听说这些被称为“尤达条件”(如“null,我的对象是”):)
  • 我不同意重复的标签。这个问题是针对 C# 和空值检查的。
  • 我现在找到了一个更合适的副本。

标签: c#


【解决方案1】:

有些人(主要是 C 开发人员)更喜欢第一种方式,因为如果您忘记了一个 = 签名,代码将无法在 C 中编译。

例如,当我忘记了一个=

int a = 0;

if(a=1) //Accidental assignment, luckily the C# compiler warns us for this. The C compiler wouldnt.
{

}    
if(1=a) // This is not logical, and not valid in either C# or C.
{

}

但是,正如 Jamietre 指出的那样,与 C 不同,它在 C# 中无法将 int 隐式转换为布尔值。编译器仍然会产生错误。但是,当您像这样比较布尔值时,它会起作用:if(a == true)。然而,这本身就很奇怪,因为您可以(并且在我看来应该)省略== true

【讨论】:

  • C# 不会编译任何一个。鉴于此,我认为将您要测试的东西放在 C# 中会更好,因为对于大多数人来说,这是一种更自然的方式来阅读代码并且没有风险。 (当然,任何一个都是完全有效的......归结为偏好。)
  • 嗯,不,在 C# 中,第一个也不会编译。编译器将在该行以“无法将类型 'int' 隐式转换为 'bool'”停止。
  • 好的,对于这个例子,它不会编译,但是如果 a 被声明为 bool 并且他忘记了等号,例如'if (a=true)' 然后它会编译。编辑:啊哈,@TJHeuvel 指出了这一点!
  • @Matt Jones,这是谁做的? if (a) { }
  • @jamietre 引用 Rutger Hauer 的话,我看到了你不会相信的事情!如果有办法写出糟糕的代码,就会有人在某个地方找到它。
【解决方案2】:

纯粹的味道。他们都将返回完全相同的东西。

【讨论】:

    【解决方案3】:

    纯味道,与昏迷、括号等相同。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2022-09-30
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多