在C#中的条件块之后,半冒号做了什么?

Ale*_*lex 31 c# compilation termination

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

if(condition)
{
   //Whatever...
};
Run Code Online (Sandbox Code Playgroud)

注意闭合支撑后的半冒号.

有谁知道这是什么影响?

我认为它没有任何影响,但会认为它会导致编译器错误.

sch*_*tte 33

这是一个简单的问题,答案很简单,但我只是想添加一些相关的东西.通常人们都知道它什么都不做,特别是对于你提出的情况,分号是一个不必要的行终止.

但它背后的理由是什么?

实际上,那些空语句允许这样的语句:

 // Use an empty statement as the body of the while-loop.
while (Method())
        ;
Run Code Online (Sandbox Code Playgroud)

我同意它什么都不做.但它可以帮助某些循环符合语言的语法要求,我认为这是人们应该从中理解的.正如其他人所说,我同意你可以删除它,我只是想强调为什么C#允许它.

进一步澄清

当您不需要执行需要语句的操作时,将使用空语句.它只是将控制权转移到声明的终点.它完全没有效果,它是纯粹的语法糖.

正如@PaulF所述,在上面的例子中,您可以使用空块({})代替.它将完全有效并具有相同的效果.

同样,这一切都归结为风格.您不需要它,但它肯定可以帮助您符合编码环境的任何规则.

常见用例(可以看到空语句)

请注意,在这种情况下,正如@EricLippert在评论部分所述,这只是对C++程序员的礼貌,他们习惯于在课后输入半成语; C++需要这个.

尽管空语句的一般用法是有争议的,主要是因为它们带来的混乱,在我看来,从语法上讲,它们在C#中占有一席之地.我们不能忘记C#是C++ 的增量(主要解释#了2×2网格中的四个"+"符号),并且由于历史原因,允许空语句促进了转换.

  • @MathieuGuindon:不,不,"范围"在C#中具有非常特殊的含义.**范围是程序文本的区域,其中可以通过其不合格的名称访问特定实体**.考虑它的正确方法是*block语句*引入了一个*局部变量声明空间*,并且紧接在该声明空间内的局部变量的*scope*是块*的文本.这些事情显然与*强烈相关*,但它们在逻辑上是不同的,所以不要混淆它们. (5认同)
  • 我相信在C#的情况下,"范围"是一个比"块"更可取的术语,考虑到范围内的花括号的含义.IMO,隐含范围+`nop`声明=不仅仅是造型问题.您可能会盲目地删除该分号,然后对您刚刚引入错误感到惊讶,因为下一个语句现在是隐式范围. (2认同)

Isa*_*itz 18

它似乎没有任何影响,但我不建议以这种方式编写代码.

如果您想要添加elseelse if之后;,它将无法编译.

例如:

if(5>1) {
  //whatever
}; else {
  //whatever
}
Run Code Online (Sandbox Code Playgroud)

这不会编译(注意;之前else)

  • 你所说的没有错,但你正在改变问题的焦点.它无法编译,因为`else`无法找到它之前的`if`.你添加了`else`,OP没有.问题是为什么最后**的分号**是允许的,而不是在有中间**的分号**会导致问题的情况下. (3认同)

Fuz*_*ear 8

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

如果您愿意,可以将其删除以清理代码,但保留代码不会造成任何不利影响.

希望这可以帮助.

  • @SebastianHofmann:只有在关闭优化时才会发出nop. (3认同)
  • Visual Studio不会忽略它,C#编译器会将其编译为空语句的有效语法,这将导致与没有尾随分号的`if`语句相同的IL生成. (2认同)