为什么C#允许{}代码块没有前面的语句?

Sel*_*don 83 c# syntax language-design

为什么C#允许代码块前没有声明(例如if,else,for,while)?

void Main()
{
    {   // any sense in this?
        Console.Write("foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

Joã*_*elo 141

所述{ ... }具有至少引入局部变量新范围的副作用.

我倾向于在switch语句中使用它们为每种情况提供不同的范围,这样我就可以在最近的使用位置定义具有相同名称的局部变量,并且还表示它们仅在案例级别有效.

  • 获得头像以匹配问题的+1!:) (143认同)
  • @Jay Bazuzi,只是因为我希望在一个以上的案例中有一个同名的局部变量并不意味着它们必须是巨大的.你刚刚跳到_huge_结论...... :) (19认同)
  • 值得一读http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx (6认同)
  • 如果你的情况需要范围,它们太大了!提取方法. (6认同)

Bol*_*ock 87

在你给出的上下文中,没有任何意义.将一个常量字符串写入控制台将在程序流程中的任何位置以相同的方式工作.1

相反,您通常使用它们来限制某些局部变量的范围.这里这里进一步详细说明.看看JoãoAngelo的回答Chris Wallis的简短例子.我相信这同样适用于其他一些具有C风格语法的语言,但并不是说它们与这个问题有关.


1 当然,除非你决定尝试搞笑并创建自己的Console类,否则使用一种Write()完全出乎意料的方法.

  • 回复:其他语言:通常,但并非总是如此.JavaScript是一个值得注意的例外; 在特定块中声明局部变量不会将变量范围限定在块中. (24认同)

Chr*_*lis 55

它不是C#的一个特性,而是使用大括号定义范围的许多C语法语言的逻辑副作用.

在您的示例中,大括号根本没有效果,但在以下代码中,它们定义变量的范围,从而定义可见性:

是允许的,因为我超出了第一个块中的范围,并在下一个块中再次定义:

{
    {
        int i = 0;
    }

    {
        int i = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

是不允许的,因为我已经超出范围并且在外部范围中不再可见:

{
    {
        int i = 0;
    }

    i = 1;
}
Run Code Online (Sandbox Code Playgroud)

等等等等.

  • 在我的词汇'('=括号,'{'=大括号,'['=方括号 (10认同)
  • @BoltClock,@ pb.好的,我提交 - 编辑: - } (2认同)

RBa*_*rda 17

我认为这{}是一个可以包含多个陈述的陈述.

考虑一个if语句,它存在于布尔表达式后面跟一个语句.这可行:

if (true) Console.Write("FooBar");
Run Code Online (Sandbox Code Playgroud)

这也可以:

if (true)
{
  Console.Write("Foo");
  Console.Write("Bar");
}
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,这被称为块语句.

既然{}可以包含其他语句,它也可以包含其他语句{}.变量的范围由它的父{}(块语句)定义.

我试图做的一点是,这{}只是一个声明,所以它不需要if或者其他......


Mas*_*imo 11

C语法语言中的一般规则是"任何之间的任何东西{ }应该被视为单个语句,它可以在单个语句可以的任何地方":

  • 过了一会儿if.
  • 之后for,whiledo.
  • 任何地方的代码.

对于所有意图和目的,它的语法语法包括:

     <statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>
Run Code Online (Sandbox Code Playgroud)

也就是说,"语句可以由(各种事物)或左括号组成,后跟语句列表(可以包括一个或多个语句),后跟一个闭括号".IE"一个{ }块可以在任何地方替换任何语句".包括在代码中间.

不允许{ }单个语句可以在任何地方使用块实际上会使语言定义更复杂.