代码之家  ›  专栏  ›  技术社区  ›  Thomas Flinkow

if块中变量范围的混淆

  •  0
  • Thomas Flinkow  · 技术社区  · 8 年前

    为什么会有这个密码

    if(...)
    {
        string b = "Hello";
    }
    if(...)
    {
        string b = "World";
    }
    

    很好,而这

    if(...)
    {
        string b = "Hello";
    }
    if(...)
    {
        string b = "World";
    }
    
    string b = "Foo";
    

    不是吗?

    它屈服了

    无法在此作用域中声明局部变量“b”,因为它将赋予“b”不同的含义,而“b”已经 在父作用域或当前作用域中使用 表示别的东西。

    (强调我的)。

    据我所知, string b = "Foo" 定义于 ,所以在 作为 string b = "Hello"; if -块,它也不是 父作用域 .

    此外,由于示例(1)工作得很好,我认为 如果 街区有自己的特色, 关闭 范围(因此没有冲突)。

    如果 块在示例(2)中也没有“关闭”作用域?

    2 回复  |  直到 8 年前
        1
  •  2
  •   MakePeaceGreatAgain    8 年前

    仅考虑作用域,您的第二个代码与此代码等效:

    string b = "Foo";
    if(...)
    {
        string b = "Hello";
    }
    if(...)
    {
        string b = "World";
    }
    

    b ,一个在外,一个在内。也就是说,在哪方面 秩序 你的声明发生了。此外,作用域不仅仅局限于自身,还包括所有子作用域。所以在你的情况下 string b = "Foo" 整个的 方法,因此也是if块的范围。但后者不包括方法的范围。

    另一方面,在第一个示例中,变量只存在于内部范围内。

        2
  •  2
  •   yu_ominae    8 年前

    在示例1中, b 那就超出范围了。因此,在每个if块中声明一个同名的新变量是完全正确的。

    在例2中, 作用域为包含if块的方法。if块可以访问具有更大范围的所有变量,因此在它们的范围中已经存在一个变量 . 这就是为什么不能声明新变量 在if语句中。

    推荐文章