最近在一个项目中,我发现了这段代码——我认为它是错误放置的:
if(condition)
{
//Whatever...
};
请注意右括号后的分号。有人知道这会有什么影响吗?
我认为它没有任何作用,但是本以为它会导致编译器错误。
最近在一个项目中,我发现了这段代码——我认为它是错误放置的:
if(condition)
{
//Whatever...
};
请注意右括号后的分号。这是一个简单的问题,有一个简单的答案,但我想补充一些相关内容。通常人们认为它什么也没做,特别是对于你提出的情况,分号是不必要的行终止符。
但是它背后的理由是什么?
实际上,这些空语句是允许的,用于像这样的语句:
// Use an empty statement as the body of the while-loop.
while (Method())
;
我同意它没有任何作用。但是它可以帮助某些循环符合语言的语法要求,我认为这是人们应该从中理解的。就像其他人所说,我同意你可以移除它,我只是想强调为什么C#允许它。void ProcessMessages()
{
while (ProcessMessage())
; // Statement needed here.
}
goto
语句(很少使用,但仍然有效)
void F()
{
//...
if (done) goto exit;
//...
exit:
; // Statement needed here.
}
来自MSDN
类声明(感谢@EricLippert提供此内容)
class SomeClass
{
...
};
请注意,在这种情况下,正如@EricLippert在评论部分中所述,这只是对C++程序员的一种礼貌,他们习惯于在类之后键入分号; C++要求这样做。
尽管通常情况下空语句的使用存在争议,主要因为它们可能带来的混淆,但在我看来,从语法上讲,它们在C#中有一定的用武之地。我们不能忘记C#是C ++的增量(这主要解释了在两乘二网格中使用#
,即四个"+"符号)而且出于历史原因,允许使用空语句有助于过渡。nop
语句=不仅仅是样式问题,而是我的看法。你可能会被诱惑盲目地删除那个分号,然后惊讶地发现你刚刚引入了一个错误,因为下一条语句现在是隐式作用域。 - Mathieu Guindon虽然这种方式似乎没有任何影响,但我不建议您以这种方式编写代码。
如果您想在 ;
后面添加 else
或 else if
,那么编译将会失败。
示例:
if(5>1) {
//whatever
}; else {
//whatever
}
这段代码无法通过编译(注意在else
前面有一个;
)
else
找不到之前的if
。是你加上了else
,而不是原始问题的作者。问题是为什么分号在结尾处是被允许的,而不是是否有时候分号在中间会引起问题。 - Flater;
不会成问题。if
语句相同的IL生成。 - Aaron M. Eshbach;
都会发出一个 nop
。 - Sebastian Hofmann
if(true) {};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
会编译通过。 - stuartdif(condition);
,那么编译器会发出警告,指出空语句可能是一个错误;这是因为对于初学者,if(condition); DoIt();
似乎在有条件地运行DoIt()
,但实际上是无条件地运行它。编译器的作者可能也会对if(condition){};
做同样的事情,但这个错误更有可能是无害的,因为它不会改变程序的含义。 - Eric Lippert