(0 == variable) 或者 (null == obj):在 C# 中已经过时了吗?

8

为什么在C语言中我们经常看到 null variable 而不是 variable null?这两种表达方式是否有区别? - Burkhard
1
啊,天哪,为什么另一个问题使用"!="而不是"=="...我找不到那篇帖子了...再次... - dance2die
@Burkhard:感谢Burkhard第二次的帮助。 - dance2die
@Jon -- 如果你使用Google和site:stackoverflow.com,会更容易一些,尽管我同意需要更多的常见问题解答。 - tvanfosson
@Sung Meister:是的,我通常使用Google搜索旧帖子。但是当我试图寻找自己的帖子时,广告会妨碍我的视线 :( 问题在于,像这样的问题很难找到 - 它可以说任何事情。 - Jon Skeet
显示剩余6条评论
4个回答

21

不需要这样做,因为它试图避免的问题 - 即:

if (variable = 0)

在 C# 中无论如何都无法编译。 if 语句中的条件必须是布尔值。仍然存在犯下以下错误的风险:

if (something = true)
if (something = false)

如果something是一个布尔变量,但更好的修复方法是避免使用常数:


if (something)
if (!something)

如果你的开发者从其他语言中带着这样的习惯用语过来,而没有考虑它们在C#中是否合适,那么你应该注意他们是否会做更多类似的事情。如果你试图像写C++代码一样写C#(或几乎任何其他语言-除了可能是VB.NET),那么你最终会编写非惯用C#代码。

编辑:正如cletus所指出的,还有一个潜在的关注点:

bool a = false, b = true; 
if (a = b) { } // No warnings

所以错误仍然可能发生 - 但那时我们已经不再将其与常量进行比较了 :) 我想这种情况非常少见,不值得花费太多时间来担心它。


那么,(0==variable) 语法在 C/C++ 中可能是一种遗留习惯? - dance2die
1
肯定,毫无疑问。它就是这样的。 - cletus
1
@Jon Skeet:你的第二个50K威望将来自于回答那些让你获得第一个50K的问题的重复问题:P - Jon B
值得注意的是:bool a = false, b = true; if (a = b) { } 不会产生任何警告。 - cletus
@Jon Skeet:感谢您的更新评论。 - dance2die
@cletus:这是我应该记住的事情。谢谢你指出来。 - dance2die

10

在现代世界中并不需要这种语法。 这是我们许多人养成的一种习惯,当我们的C编译器没有警告我们即将发射导弹时。

if(status = RED_ALERT)
{
    launchMissiles();
}

5

我猜这是一种习惯。在C语言中:

 if (0 = variable)

将会抛出编译错误,而

 if (variable = 0)

不会。

0

这不是必需的对于C#。但这仍然是一个好主意。

编程都是关于习惯的,你永远不知道何时会发现自己在编写一些JavaScript或更新你认为早已消失的旧程序。


你不觉得这会稍微影响可读性吗?当我们大声朗读代码时,我们并没有检查零是否等于一个变量。我们已经知道只有零才能等于零。我们想要检查的是变量是否等于零。 - Michael Meadows
我不知道:我认为无论哪种方式都很清楚。 - Joel Coehoorn
我已经多次听到可读性的理由,但我也从未认为这是一个问题。 == 运算符是对称的(除非你重写它!),因此 x == 0 应该与 0 == x 读起来一样。从过去的争论中我知道自己是少数派 :) - Bill the Lizard
由于某种原因,我发现在我的脑海中“null == obj”这部分代码听起来相当不自然...通常人们会说“当一个对象为空时”,而不是“空是对象”。 - dance2die
2
编程不应该成为习惯。你应该非常清楚自己使用的编程语言,并使用适当的语言习惯。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接