6

我正在查看 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);
     }
  }
4

6 回答 6

13

C# 中的分号只是表示语句结束。空语句或仅 a;本身是有效的。

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

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

在同一主题上,但与手头的问题半不同的是,是一组空的花括号,{ }. 这些表示“代码块”,但在代码中几乎任何地方都有效。同样,您可以在一行中包含类似以下内容,它仍然可以正常编译:

{ } { ;;;;;;;;;; } { }

最后,空语句和空代码块都编译为“没什么可看的,伙计们,继续前进”,并且在大多数情况下,可以从代码中删除而不会产生任何后果。

于 2013-01-08T16:47:21.363 回答
7

作为 ac# 开发人员,我使用“空语句”

;

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

当我有一个多行 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
              })

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

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
}
于 2013-01-08T16:47:07.183 回答
6

这是一个什么都不做的声明。通常这是没有意义的,可以直接删除,但有时需要声明,而你真的不希望发生任何事情。

有时你会看到循环会导致副作用,因此不需要正文:

int count = 0;
while(isTheRightNumber(count++))
    ;

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

int count = 0;
while(isTheRightNumber(count++)) 
    { } //empty by design

另一个例子是将for循环用于无限循环的模式:

for(;;)
{
    //stuff
}

本质上是一样的:

while(true)
{
    //stuff
}
于 2013-01-08T16:46:10.307 回答
3

这是一句空话。我从未使用过它,但它存在于多种语言中。

于 2013-01-08T16:47:00.600 回答
2

分号(;) 表示语句的结束。因此,如果您只添加一个分号而没有任何内容...这意味着它是空语句

于 2013-01-08T16:48:42.997 回答
1

当语句需要一个块但您不希望它做任何事情时,有时会使用空语句。

例如:

for(i=0; array[i]!=null; i++)
    ;

或者对于没有大括号的嵌套 if then elses:

// don't really do this kids
if(cond1)
  if(cond2)
    doit();
  else
    ;
else
  dont();

有时用于“如果”清晰:

if(somecomplicatedconditionisnotfalseinverted()) // <-- this is already complicated enough, let's not ! that.
  ; // do nothing
else {
  ohnoes();
}

但是在您的示例中,它在为发布而构建时完全没有任何作用,而在为调试而构建时只是添加了一个 nop,因此您可以在其上放置一个断点。

于 2013-01-08T16:50:25.567 回答