C#为什么允许没有前置语句(如if
、else
、for
、while
)的代码块?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
C#为什么允许没有前置语句(如if
、else
、for
、while
)的代码块?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
{ ... }
至少具有引入新的本地变量作用域的副作用。
我倾向于在 switch
语句中使用它们,为每个 case 提供不同的作用域,并以此方式允许我在最接近其使用位置定义同名的本地变量,并标识它们仅在 case 级别有效。
{}
的问题来获得那些金徽章... :) - João Angelo1 当然,除非你想要有趣并创建自己的Console
类,其中包含一个完全意想不到的Write()
方法。
这不是 C# 的一个 特性,而是许多使用大括号来 定义作用域 的 C 语法语言的逻辑副作用。
在你的示例中,大括号根本没有任何影响,但在以下代码中它们定义了变量的作用域和可见性:
这是允许的,因为 i 在第一个块中已经超出作用域,在下一个块中被重新定义:
{
{
int i = 0;
}
{
int i = 0;
}
}
这样是不允许的,因为i已经超出了其作用域并且在外部作用域中不再可见:
{
{
int i = 0;
}
i = 1;
}
等等,等等。
{}
被称为圆括号? - BoltClock一种由[ ]或( )形成的两个标记,在数学中也使用{},用于将单词或多个单词、部分数学公式或类似内容括起来,以使其与上下文分开;
无论如何,它们不是圆括号,但"花括号"似乎可以。 - dumbledad我认为{}
是一个可以包含多个语句的语句。
考虑一个由布尔表达式后跟一个语句组成的if语句。 这将起作用:
if (true) Console.Write("FooBar");
这也可以起作用:if (true)
{
Console.Write("Foo");
Console.Write("Bar");
}
如果我没记错的话,这被称为块语句。
由于{}
可以包含其他语句,因此它还可以包含其他{}
。
变量的作用域由其父级{}
(块语句)定义。
我要表达的重点是{}
只是一个语句,因此不需要if或任何其他东西。
{ }
之间的内容应被视为单个语句,并可以放置在任何单个语句可以出现的地方”,包括:
if
语句之后。for
、while
或do
循环之后。 <statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>
也就是说,"语句可以由不同的元素组成或由一个左括号、后面跟着一个语句列表(可能包含一个或多个语句),然后是右括号"。也就是说,"{ }
块可以替换任何语句的位置",包括在代码中间。
如果不允许在任何语句可以放置的地方使用{ }
块,实际上会使语言的定义 更加复杂。
// if (a == b)
// if (a != b)
{
// do something
}
就我个人而言,在C#中使用无语句的代码块可以大大提高其他开发人员的可读性,同时要记住代码块限制了局部变量的作用域。例如,考虑以下代码片段,由于额外的代码块,它更容易阅读:
OrgUnit world = new OrgUnit() { Name = "World" };
{
OrgUnit europe = new OrgUnit() { Name = "Europe" };
world.SubUnits.Add(europe);
{
OrgUnit germany = new OrgUnit() { Name = "Germany" };
europe.SubUnits.Add(germany);
//...etc.
}
}
//...commit structure to DB here
我知道这个问题可以通过为每个结构级别使用方法来更优雅地解决。但是请记住,像样本数据种子生成器之类的东西通常需要快速执行。
因此,尽管上面的代码是按顺序执行的,但代码结构代表了对象的“真实世界”结构,从而使其他开发人员更容易理解、维护和扩展。
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;
}
}