分号在 C# 中的条件块之后做什么?

What does a semi colon do after a conditional block in C#?

我最近在一个项目中遇到了这段代码 - 我认为这是错误的:

if(condition)
{
   //Whatever...
};

注意右大括号后的分号。

有谁知道这是什么效果吗?

我假设它没有任何效果,但我认为它会导致编译器错误。

Visual Studio 将编译为空语句的有效语法,因为它只是一个语句终止。您的代码将编译并且额外的 ; 不会成为问题。

如果你愿意,可以删除它以清理代码,但保留它不会造成任何不利影响。

希望对您有所帮助。

虽然我不建议这样写代码,但似乎没有任何效果。

如果您想要在 ; 之后添加 elseelse 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 网格中的四个“+”符号)和历史原因,允许空语句促进了过渡。