这个看似无关的块(在if语句之后)如何工作?

时间:2017-08-01 22:30:44

标签: c#

我继承了一些代码,偶尔会使用以下代码:

if (a)
    foo();
{
    if (b)
        boo();
    moo();
}

我不确定如何自然地阅读,但代码编译并运行。

有人可以解释一下这是如何工作的,以便我可以用更易读的格式重写它吗?或者,有人可以解释为什么这种表示法有用吗?

2 个答案:

答案 0 :(得分:70)

您发布的代码更好地写为:

   if (a)
   {
       foo();
   }
   if (b)
   {
       boo();
   }
   moo();

C#中的大括号有两个目的:

  1. 他们为变量声明创建了一个范围。
  2. 他们将语句组合在一起,以便条件和循环等一次可以应用于多个语句。
  3. 无论是谁编写了您发布的代码,都选择不将它们用于第二目的。 if语句可以在不使用任何大括号的情况下完全合法,但它们仅适用于紧跟在它们之后的语句(例如在第一个foo()之后调用if)。

    因为有一个与控制流无关的大括号的合法用例,所以有人将大括号放在与if语句无关的随机位置是完全可以接受的。< / p>

    此代码:

    foo();
    {
       var a = boo();
    }
    {
       var a = moo();
    }
    

    ...相当于这段代码:

    foo();
    var a = boo();
    var b = moo();
    

    ...但你会注意到我无法命名第二个变量a,因为它不再通过作用域括号与第一个变量分开。

      

    或者,有人可以解释为什么这种表示法有用吗?

    我可以想到三种可能性:

    1. 他们想在方法的不同部分重用变量名,因此他们用大括号创建了一个新的变量范围。
    2. 他们认为大括号可能是一个很好的视觉辅助工具,可以封装在其中发现的所有逻辑。
    3. 他们实际上很困惑,程序不像他们认为的那样工作。
    4. 前两种可能性假设他们实际上不仅仅是在实际生产代码中调用foo()moo()

      在任何情况下,我都不认为这些可能性是编写这样的代码的好理由,并且您完全有权以更容易理解的方式重写代码。

答案 1 :(得分:1)

大括号在foo()而非if(a)之后开始(如if(a){),因此这些大括号在此上下文中无用。

if (a)
    foo();
//{
    if (b)
        boo();
    moo();
//}

等于

if (a)
    foo();

if (b)
    boo();

moo();

这些大括号用于限制上下文。在这些大括号内创建的变量只有在大括号结束时才会存在。