一个 ; 在C#中没有声明

gma*_*ser 6 .net c# visual-studio-2010

我正在查看C#中的代码示例.有;没有收到任何声明.我以为这是错字.我试着编译;.它汇编得很好.有什么用的;,没有任何代码语句?

我正在使用VS 2010,C#和.Net 4.0

  private void CheckSmcOverride(PatLiverSmc smc)
  {
     ;
     if (smc.SmcOverride && smc.Smc != null 
              && smc.Smc.Value < LiverSmcConst.SMC_OVERRIDE_POINT)
     {
          smc.Smc = 10;
          _logger.DebugFormat("CheckSmcOverride: Override SMC {0}", smc.Smc);
     }
  }
Run Code Online (Sandbox Code Playgroud)

new*_*rey 13

C#中的分号只是表示一个结尾的语句.空语句或仅仅是单独的语句;是有效的.

您可以在C#中的任何函数内单独使用以下行,它应该可以正常编译:

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
Run Code Online (Sandbox Code Playgroud)

在同一主题上,但与手头的问题半不同,是一组空的花括号,{ }.这些表示"代码块",但在代码中的任何位置都有效.同样,你可以在一行中拥有类似下面的东西,它仍然可以正常编译:

{ } { ;;;;;;;;;; } { }
Run Code Online (Sandbox Code Playgroud)

最后,空语句和空代码块全部编译为"没有什么可以看到这里的人,移动",并且在大多数情况下,可以从代码中删除而没有后果.

  • 需要代码填充?为什么不Zoidberg?`{} {;;} {}` (13认同)

Pau*_*van 7

作为ac#developer我使用'空语句'

;
Run Code Online (Sandbox Code Playgroud)

(作为评论要求的有用案例)

当我有一个多行lambda,我想检查最后一行评估,即

list.ForEach(x=>
              {
                x.result = x.Value * x.AnotherValue;
                ; // otherwise I can't ever see these as you can't break on the end brace of an anonymous function
              })
Run Code Online (Sandbox Code Playgroud)

作为一种在评估之前的一些代码中断点的方法,即

void SomeFunct()
{
    int a = someOtherFunct();
    ; //I want a breakpoint here but...
    //there is some huge code segment that will get skipped before I can breakpoint
}
Run Code Online (Sandbox Code Playgroud)

  • 你对它的使用并不等于它被允许的原因;) (2认同)

Ser*_*rvy 6

这是一个什么都不做的声明.通常情况下,这将是毫无意义的,可能只是被删除,但有时会有一个声明,你真的不想发生任何事情.

有时你看到这个循环导致副作用,所以不需要身体:

int count = 0;
while(isTheRightNumber(count++))
    ;
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢这样的代码示例,并且不鼓励这种做法,因为它们往往比具有副作用的自由条件的循环更难理解.使用一组空括号更清晰,包括相关注释,例如:

int count = 0;
while(isTheRightNumber(count++)) 
    { } //empty by design
Run Code Online (Sandbox Code Playgroud)

另一个例子是使用for循环进行无限循环的模式:

for(;;)
{
    //stuff
}
Run Code Online (Sandbox Code Playgroud)

基本上与以下相同:

while(true)
{
    //stuff
}
Run Code Online (Sandbox Code Playgroud)