我最近在一个项目中遇到了这段代码-我认为那是错误的:
if(condition)
{
//Whatever...
};
注意右括号后的分号。
有人知道这有什么影响吗?
我认为它没有任何作用,但是我认为它会导致编译器错误。
答案 0 :(得分:33)
这是一个简单的问题,有一个简单的答案,但我只是想添加一些相关的内容。人们通常都知道它什么都不做,特别是对于您介绍的情况,分号是不必要的行终止符。
但是背后的原因是什么?
实际上,对于这些语句,允许使用这些空语句:
// Use an empty statement as the body of the while-loop.
while (Method())
;
我同意它什么也不做。但这可以帮助某些循环符合该语言的语法要求,我认为这是人们应该从中了解的内容。正如其他人所说,我同意您可以删除它,我只是想强调为什么C#允许它。
进一步的说明
当您不需要执行需要执行语句的操作时,将使用空语句。它只是将控制权转移到语句的终点。它根本没有作用,它是纯语法糖。
如@PaulF所述,在上面的示例中,您 可以 使用一个空块({}
)代替。这将是完全有效的,并且具有相同的效果。
同样,一切都归结为风格。您不需要它,但它肯定可以帮助您符合编码环境的任何规则。
常见用例(其中可以看到空语句)
循环为空的正文(与我在上面加下划线的情况相同)
void ProcessMessages()
{
while (ProcessMessage())
; // Statement needed here.
}
goto
语句(很少使用但仍然有效)
void F()
{
//...
if (done) goto exit;
//...
exit:
; // Statement needed here.
}
来自MSDN
类声明(@ EricLippert提出的要求)
class SomeClass
{
...
};
请注意,在这种情况下,如@EricLippert在注释部分所述,这只是对习惯于在类后键入Semi的C ++程序员的礼貌; C ++要求这样做。
尽管空语句的一般用法值得商mainly,主要是因为它们在语法上带来的混乱,在我看来,它们在C#中占有一席之地。我们一定不要忘记C#是C ++的 increment (主要解释#
,也就是两乘二的网格中的四个“ +”符号),并且由于历史原因,允许空语句有助于过渡。
答案 1 :(得分:18)
它似乎没有任何作用,尽管我不建议那样编写代码。
如果您想在else
之后添加else if
或;
,它将无法编译。
例如:
if(5>1) {
//whatever
}; else {
//whatever
}
这将不会编译(请注意;
之前的else
)
答案 2 :(得分:8)
Visual Studio会将其编译为空语句的有效语法,因为它只是语句终止。您的代码将被编译,多余的;
不会成为问题。
如果需要,可以将其删除以清理代码,但是将其保留不会造成任何不利影响。
希望这会有所帮助。