关于 .NET(c#) 中的变量范围

本文关键字:变量 范围 NET 关于 | 更新日期: 2023-09-27 18:35:21

参考代码

public void MyMethod()
{
    string x;
    List sampleList = populateList();
    foreach(MyType myType in sampleList)
    {
        string x;   // why is this not allowed?
        doSomethingwithX(x);
    }
}

我最近开始学习 C#,今天遇到了与上述类似的代码问题。VS2010 用此消息标记了注释的代码 a local variable named x cannot be declared in this scope because it would give a different meaning to variable x which is already used in parent or current scope to denote something else ....

我不明白...这不就是块语句和范围界定的全部本质吗......我知道我可以更改我的变量名称并继续。但我想知道为什么?

关于 .NET(c#) 中的变量范围

我不明白...这不就是块语句和范围界定的全部本质吗......

不,不是真的。范围界定的目的不是"允许您重用名称"。

我知道我可以更改我的变量名称并继续。但我想知道为什么?

基本上,它减少了混淆代码的可能性。在各种情况下,C# 会阻止您编写令人困惑的代码。当然,没有我们想要的那么多,但是如果允许某事没有明显的好处,而不允许它有明显的好处,那么不允许它是有意义的。

您是否想要使用在作用域中两次具有相同局部变量名称的代码?您不是总是希望原始开发人员使用不同的名称吗?我会 - 所以我很高兴编译器强制执行。

请注意,这并不能阻止在同一方法中两次使用相同的局部变量名称 - 它们不能在同一范围内。所以这是有效的:

public void Foo()
{
    {
        int x = 10;
        ...
    }
    {
        int x = 10;
        ...
    }
}

但这不是:

public void Foo()
{
    {
        int x = 10;
        ...
    }
    int x = 10;
    ...
}

如果第二个示例令人困惑,您需要记住,局部变量的作用域是声明它的 - 而不是从声明点开始。

以前定义的x仍在范围内,这就是编译器阻止您声明另一个的原因。

您可以通过将前一个变量括在大括号中来限制其范围来验证这一点 -

  public void MyMethod()
  {
      {
        string x;
      }
      List sampleList = populateList();    
      foreach(MyType myType in sampleList)
      {
          string x;   // This will be fine.
          doSomethingwithX(x);
      }
   }
for 循环中的 x 在循环

中不可见,但在方法开始时声明的 x 在 for 循环中可见。

在循环之外,你有一个x,但里面有两个,两者都被声明了

你不能声明字符串 x; 同样......它会有不同的含义。 由于字符串 x;在方法中声明。 x 的作用域将在整个方法中可用。.因此,请为每个循环声明一些其他变量。..

或者你可以只是x。而不是再次声明。.