代码之家  ›  专栏  ›  技术社区  ›  Simon

这个看似不相连的块(在if语句之后)是如何工作的?

c#
  •  30
  • Simon  · 技术社区  · 7 年前

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

    有人能解释一下它是如何工作的,这样我就可以用更容易理解的格式重写它了吗?或者,有人能解释一下为什么这个符号会有用吗?

    2 回复  |  直到 7 年前
        1
  •  69
  •   StriplingWarrior    7 年前

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

    C#中的大括号有两个用途:

    1. 它们为变量声明创建了一个作用域。

    无论是谁编写了您发布的代码,都选择不将其用于第二个目的。 if foo() 第一次之后 如果 ).

    然而,因为有一个与控制流无关的大括号的合法用例,所以完全可以接受将大括号放在与控制流无关的随机位置 如果

    此代码:

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

    …等同于此代码:

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

    a 因为它不再通过作用域括号与第一个变量分离。

    我可以想到三种可能性:

    1. 他们想在方法的不同部分重用变量名,所以他们用大括号创建了一个新的变量范围。
    2. 他们认为大括号可能是一种很好的视觉辅助工具,可以封装其中的所有逻辑。
    3. 他们实际上很困惑,这个程序并没有按照他们认为的方式工作。

    前两种可能性假设他们实际上做的不仅仅是打电话 foo() moo()

    无论如何,我认为这些可能性都不是编写这样代码的好理由,你完全有权以更容易理解的方式重写代码。

        2
  •  1
  •   SMUsamaShah    7 年前

    foo() 而不是 if(a) (如 if(a){ )因此,在这种情况下,这些大括号是无用的。

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

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

    像这样的大括号用于限制上下文。在这些大括号内创建的变量仅在大括号结束之前存在。