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