C# 为什么要编译带有多个分号的代码?

C# 为什么要编译带有多个分号的代码?,c#,syntax,C#,Syntax,我只是想知道为什么这是允许的 int i=0;; 我不小心打了那个。但是程序编译了。几天后我注意到我已经输入了 之后,我尝试使用不同的符号,如~,!,:etc等 为什么在第一个允许的地方不允许这样做 int i=0;; 只是想知道。额外的只需在C#代码中加上一行,尽管是空白。其他符号单独放置时没有意义。因为分号表示语句的结束。其他人没有。您可以有一个空语句。您键入了一个空语句: int i=0; // that's one statement ; // that's another C#中

我只是想知道为什么这是允许的

int i=0;;
我不小心打了那个。但是程序编译了。几天后我注意到我已经输入了

之后,我尝试使用不同的符号,如
~,!,:etc等

为什么在第一个允许的地方不允许这样做

int i=0;;

只是想知道。

额外的
只需在C#代码中加上一行,尽管是空白。其他符号单独放置时没有意义。

因为分号表示语句的结束。其他人没有。您可以有一个空语句。

您键入了一个空语句:

int i=0; // that's one statement
; // that's another
C#中的声明没有正文是合法的

根据本手册第8.3节:

空语句不起任何作用

空语句:
;
在需要语句的上下文中没有要执行的操作时,使用空语句


空语句实际上是有用的。查看这个有趣的无限循环示例:

    for (;;)
    {
        // loops infinitely
    }
运行以下版本作为证明,但从无限开始中断:

    int count = 0;
    for (;;)
    {
        count++;
        if (count > 10) break;
    }

    Console.WriteLine("Done");

但是,如果您确实想执行无限循环,请使用:
while(true){}
而不是(;;){}
。while(true)不那么简洁,更容易阅读,并且容易传达无限循环的意图。

C#(和许多其他语言)使用分号分隔语句,而不关心换行符。空语句是有效的,因此可以根据需要放置任意多的分号。这也意味着您可以将多条语句放在一行上,或者将一条语句拆分为多行—编译器不会在意。

每个问这个问题的人都是C-syntax语言不理解什么
意味着。或者可能没有正确解释(“你在换行时必须放一个分号,这很神奇!”)o.o
(也是有效语法)另外,
{{{{{{{{{{{{}}}
是有效语法,在这里可以创建多个嵌套作用域;它自己被编译器删除了,还是插入了noop?@Bear:问得好。我不知道,但这行代码来自同一个规范部分-执行空语句只是将控制权转移到语句的端点。-让我倾向于NOP或类似的。只有编译后的代码才能执行。@Michael Hmm,因此如果它插入NOP,可能会影响锁定代码的可靠性,例如Monitor.Enter(obj);试试{…}最后{Monitor.Exit(obj);}。@Bear:你觉得怎么样?注意,在调试模式下,每个大括号(
{
}
)生成一个NOP。这就是如何在大括号上设置断点的方法。@Michael IIRC我在一篇文章中读到,CLR保证在Enter和Try之间不会发生中断,以实现可靠的锁释放。我不确定,但我想它也说了不允许在进入和尝试启用这种行为之间进行。你能用我写的lock语句在释放模式下设置Enter和Try之间的断点吗?我在这台计算机上没有VS。