2

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

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

就我而言,我宁愿写:

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

毕竟,如果textnullEquals将返回false,这是意料之中的。常量和变量的反转感觉很奇怪,但是对于初学者来说还是可以理解的,并且避免了NullReferenceExceptionwhich 会被抛出text.Equals("Some text here")

我错过了什么吗?

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


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

4

5 回答 5

11

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

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

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

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

我错过了什么吗?

不,你没有错过任何东西。

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

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

于 2012-05-11T13:01:55.807 回答
5

仅此一点并没有错。

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

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

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

if (string.Equals(text, "Some text here"))
{
    // Do something here.
}
于 2012-05-11T13:02:03.210 回答
2

只要您有文字或您知道不会有的东西,您的版本就可以了null

另一方面,如果你有

if (text1.Equals(text2))

那么显然你需要防御text1存在null

但我会Equals在这里停止使用并使用==它消除了null检查的需要

if (text1 == text2)

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

于 2012-05-11T13:03:12.303 回答
0

我认为这是人性,当你比较smth时,你总是将“你的”东西与其他人比较。不是相反,我认为同样的自然想法也适用于 C# 编码:)

于 2012-05-11T13:02:28.693 回答
0

我只会使用if (text == "Some text here"). 它清晰、简洁、快速。您提到的IsNullOrEmpty检查可能是(很可能是无用的)微优化。

于 2012-05-11T13:02:52.360 回答