在C#中有条件阻止后,半冒号做什么?

时间:2018-07-10 12:40:52

标签: c# compilation termination

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

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

注意右括号后的分号。

有人知道这有什么影响吗?

我认为它没有任何作用,但是我认为它会导致编译器错误。

3 个答案:

答案 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会将其编译为空语句的有效语法,因为它只是语句终止。您的代码将被编译,多余的;不会成为问题。

如果需要,可以将其删除以清理代码,但是将其保留不会造成任何不利影响。

希望这会有所帮助。