为什么C#允许代码块没有前面的语句?
为什么C#允许代码块没有前面的语句(例如, if
, else
, for
, while
)?
void Main() { { // any sense in this? Console.Write("foo"); } }
在你给的上下文中,没有任何意义。 将一个常量string写入控制台将在程序stream程中的任何位置以相同的方式工作。 1
相反,你通常使用它们来限制一些局部variables的范围。 这在这里和这里进一步阐述。 请看JoãoAngelo的答案和Chris Wallis的答案 。 我相信其他一些C风格语言的语言也是如此,但并不是说它们与这个问题有关。
1 当然,除非你决定尝试变得有趣,并用一个Write()
方法创build你自己的Console
类,而这个方法完全是意想不到的。
{ ... }
至less有一个引入局部variables的新范围的副作用。
我倾向于在switch
语句中使用它们来为每种情况提供一个不同的范围,并以这种方式允许我在最接近可能的位置使用相同的名称来定义局部variables,并且还表示它们仅在情况级别有效。
它不是C#的一个特性 ,而是许多使用大括号来定义范围的 C语法语言的逻辑副作用。
在你的例子中,大括号根本没有任何作用,但是在下面的代码中,它们定义了variables的范围,从而定义了variables的可见性:
这是允许的,因为我超出了第一块的范围,并在下一个定义:
{ { int i = 0; } { int i = 0; } }
这是不允许的,因为我超出了范围,在外部范围内不再可见:
{ { int i = 0; } i = 1; }
等等等等。
我认为{}
是一个可以包含几个陈述的陈述。
考虑一个if语句,它存在于一个布尔expression式后面跟着一个语句。 这将工作:
if (true) Console.Write("FooBar");
这也可以工作:
if (true) { Console.Write("Foo"); Console.Write("Bar"); }
如果我没有弄错,这就是所谓的块声明。
由于{}
可以包含其他语句,因此也可以包含其他语句。 variables的作用域是由它的父项(块语句)定义的。
我试图做的一点是, {}
只是一个声明,所以它不需要一个if或其他…
C语言语言的一般规则是“任何{ }
之间的内容应该被视为一个单一的语句,它可以去任何一个语句可以”:
- 之后
if
。 - 经过一段
for
,while
或do
。 - 任何地方在代码 。
对于所有的意图和目的,语言语法包括:
<statement> :== <definition of valid statement> | "{" <statement-list> "}" <statement-list> :== <statement> | <statement-list> <statement>
也就是说,“一个陈述可以由(各种各样的东西)组成,也可以由一个大括号组成,后面跟着一个陈述清单(可能包括一个或多个陈述),然后是一个大括号”。 IE“a { }
块可以replace任何地方的任何语句”。 包括在代码中间。
不允许在单个语句的任何位置使用块,实际上会使语言定义更加复杂 。
因为C ++(和java)允许没有前面的语句的代码块。
C ++允许他们,因为C做了。
你可以说这一切都归结为美国的程序语言(基于C语言)devise赢得了而不是欧洲语言(基于Modula-2 )的devise。
(控制语句作用于单个语句,语句可以是组创build新的语句)
// if (a == b) // if (a != b) { // do something }
1因为…它维护声明的范围区域或函数,这对于大代码是非常有用的。
{ { // Here this 'i' is we can use for this scope only and out side of this scope we can't get this 'i' variable. int i = 0; } { int i = 0; } }