关于 .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
....
我不明白...这不就是块语句和范围界定的全部本质吗......我知道我可以更改我的变量名称并继续。但我想知道为什么?
我不明白...这不就是块语句和范围界定的全部本质吗......
不,不是真的。范围界定的目的不是"允许您重用名称"。
我知道我可以更改我的变量名称并继续。但我想知道为什么?
基本上,它减少了混淆代码的可能性。在各种情况下,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);
}
}
中不可见,但在方法开始时声明的 x 在 for 循环中可见。
在循环之外,你有一个x,但里面有两个,两者都被声明了
你不能声明字符串 x; 同样......它会有不同的含义。 由于字符串 x;在方法中声明。 x 的作用域将在整个方法中可用。.因此,请为每个循环声明一些其他变量。..
或者你可以只是x。而不是再次声明。.