如何解决为什么C#允许{}代码块没有前面的语句?
| 为什么C#允许没有前面语句的代码块(例如if
,else
,for
,while
)?
void Main()
{
{ // any sense in this?
Console.Write(\"foo\");
}
}
解决方法
在您给出的上下文中,没有任何意义。将常量字符串写入控制台将在程序流中的任何地方以相同的方式工作。1
相反,通常使用它们来限制某些局部变量的范围。此处和此处将进一步详细说明。请查看JoãoAngelo的答案和Chris Wallis的答案,以获取简要示例。我相信同样适用于其他一些具有C样式语法的语言,尽管它们与该问题无关。
1除非,当然,除非您决定尝试变得有趣,然后使用
Write()
方法创建自己的ѭ5does类,该方法做的事情完全出乎意料。
,“ 7”至少具有为局部变量引入新范围的副作用。
我倾向于在switch
语句中使用它们,以为每种情况提供不同的范围,并以这种方式允许我在使用它们的最接近位置处定义具有相同名称的局部变量,并且还表示它们仅在案例级别有效。
,它不是C#的功能,而是它是许多使用花括号定义范围的C语法语言的逻辑副作用。
在您的示例中,花括号根本没有作用,但是在以下代码中,花括号定义了变量的范围以及可见性:
这是允许的,因为我超出了第一个块的范围,并在下一个块中再次定义:
{
{
int i = 0;
}
{
int i = 0;
}
}
这是不允许的,因为我已经超出范围,并且在外部范围中不再可见:
{
{
int i = 0;
}
i = 1;
}
等等等等。
,我认为“ 11”是一个可以包含多个语句的语句。
考虑一个布尔表达式后跟一个语句的if语句。
这将工作:
if (true) Console.Write(\"FooBar\");
这也可以工作:
if (true)
{
Console.Write(\"Foo\");
Console.Write(\"Bar\");
}
如果我没记错的话,这就是一个语句块。
由于“ 11”可以包含其他语句,因此也可以包含其他“ 11”。
变量的范围由其父变量“ 11”(块语句)定义。
我要说明的是ѭ11只是一个语句,因此它不需要if或其他...
,C语法语言的一般规则是““ѭ18之间的任何内容都应视为一条语句,并且可以在一条语句可以到达的任何地方” \“:
在if
之后。
在for
,while
或do
之后。
代码中的任何地方。
出于所有意图和目的,这是因为语言语法包括以下内容:
<statement> :== <definition of valid statement> | \"{\" <statement-list> \"}\"
<statement-list> :== <statement> | <statement-list> <statement>
也就是说,“一个语句可以由(各种事物)或一个大括号组成,后跟一个语句列表(可能包括一个或多个语句),然后是一个封闭的括号”。即\“{ }
块可以在任何地方替换任何语句\”。包括中间的代码。
不允许在单个语句可以到达的任何地方出现“ 18”块实际上会使语言定义更加复杂。
,因为C ++(和Java)允许代码块不带前面的语句。
C ++允许它们,因为C允许。
您可以说这全都归结为事实:美国程序语言(基于C)的设计胜于欧洲程序语言(基于Modula-2)的设计。
(控制语句作用于单个语句,语句可以分组以创建新的语句)
,// 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;
}
}
,您问“为什么” C#允许代码块不包含前面的语句。问题“为什么”也可以解释为“这种结构可能带来什么好处?”
就个人而言,我在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
我知道可以通过为每个结构级别使用方法来更优雅地解决此问题。但是,再次提醒您,样本数据播种器之类的东西通常需要快速。
因此,即使上面的代码是线性执行的,代码结构也代表了对象的“真实世界”结构,因此使其他开发人员更容易理解,维护和扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。