为什么在将值与常量进行比较之前检查null?

时间:2012-05-11 12:58:44

标签: c#

有时,必须使用常量检查值是否相等。在这种情况下,我总是看到这样的代码:

if (!string.IsNullOrEmpty(text))
{
    if (text == "Some text here")¹
    {
        // Do something here.
    }
}

就我而言,我宁愿写:

if ("Some text here".Equals(text))
{
    // Do something here.
}

毕竟,如果textnullEquals将返回false,这是预期的。常量和变量的反转感觉很奇怪,但对初学者来说仍然可以理解,并且避免NullReferenceException抛出的text.Equals("Some text here")

我错过了什么吗?

为什么我见过的所有源代码都使用第一个示例中的语法,而不是第二个示例中的语法?


¹在实际代码中,它宁愿是常量字段或只读字段。为了缩短示例,我将字符串内联。

5 个答案:

答案 0 :(得分:11)

  

在这种情况下,我总是看到这样的代码:

你认为这是奇怪的和不必要的是正确的,因为它是。这是一个完全多余的null或空检查。坦率地说,我会在代码审查中告诫这样的代码。

if (text == "Some text here") {
    // Do something here.
}

非常好,这就是我使用的。

  

我错过了什么吗?

不,你没有遗漏任何东西。

  

为什么我见过的所有源代码都使用第一个示例中的语法,而不是第二个示例中的语法?

因为你在错误的地方寻找爱情?

答案 1 :(得分:5)

这就没有错。

if (text == "Some text here")
{
    // Do something here.
}

无需检查null / empty,因为它无论如何都不会相等。

如果您希望使用Equals方法,则有一个对空值不敏感的版本。

if (string.Equals(text, "Some text here"))
{
    // Do something here.
}

答案 2 :(得分:2)

只要您有文字或某些您不知道null的内容,您的版本就可以了。

另一方面,如果你有

if (text1.Equals(text2))

然后显然你需要防御text1 null

但我会在此处停止使用Equals并使用==,从而无需进行null检查

if (text1 == text2)

您是否因为Java根源而更喜欢使用Equals

答案 3 :(得分:0)

我认为这是人性,当你比较smth时,你总是将“你的”东西与别人比较。而不是相反,我认为同样的自然思想也去了C#编码:)

答案 4 :(得分:0)

我会使用if (text == "Some text here")。它清晰,简洁,快速。您引用的IsNullOrEmpty检查可能是(最可能无用的)微优化。