我继承了一些代码,偶尔会使用以下代码:
if (a)
foo();
{
if (b)
boo();
moo();
}
我不确定如何自然地阅读,但代码编译并运行。
有人可以解释一下这是如何工作的,以便我可以用更易读的格式重写它吗?或者,有人可以解释为什么这种表示法有用吗?
答案 0 :(得分:70)
您发布的代码更好地写为:
if (a)
{
foo();
}
if (b)
{
boo();
}
moo();
C#中的大括号有两个目的:
无论是谁编写了您发布的代码,都选择不将它们用于第二目的。 if
语句可以在不使用任何大括号的情况下完全合法,但它们仅适用于紧跟在它们之后的语句(例如在第一个foo()
之后调用if
)。
因为有一个与控制流无关的大括号的合法用例,所以有人将大括号放在与if
语句无关的随机位置是完全可以接受的。< / p>
此代码:
foo();
{
var a = boo();
}
{
var a = moo();
}
...相当于这段代码:
foo();
var a = boo();
var b = moo();
...但你会注意到我无法命名第二个变量a
,因为它不再通过作用域括号与第一个变量分开。
或者,有人可以解释为什么这种表示法有用吗?
我可以想到三种可能性:
前两种可能性假设他们实际上不仅仅是在实际生产代码中调用foo()
和moo()
。
在任何情况下,我都不认为这些可能性是编写这样的代码的好理由,并且您完全有权以更容易理解的方式重写代码。
答案 1 :(得分:1)
大括号在foo()
而非if(a)
之后开始(如if(a){
),因此这些大括号在此上下文中无用。
if (a)
foo();
//{
if (b)
boo();
moo();
//}
等于
if (a)
foo();
if (b)
boo();
moo();
这些大括号用于限制上下文。在这些大括号内创建的变量只有在大括号结束时才会存在。