u可以多次单击按钮,每次单击都会创建一个具有不同HashCode的新面板。但是问题是,它们都名为myPanel,并且永远不会出错。
private void Form1_Load(object sender, EventArgs e)
{
Panel myPanel = new Panel();
Panel myPanel = new Panel(); //Wrong
}
private void button1_Click(object sender, EventArgs e)
{
Panel myPanel = new Panel(); //OK
richTextBox1.AppendText(myPanel.GetHashCode().ToString() + Environment.NewLine);
}
答案 0 :(得分:2)
无法编译:
private void Form1_Load(object sender, EventArgs e)
{
Panel myPanel = new Panel();
Panel myPanel = new Panel(); //Wrong
}
因为您已经在此范围内声明了一个名为myPanel
的变量(大括号{ ... }
之间的代码
考虑一下;如果您要这样说,并且是合法语法:
private void Form1_Load(object sender, EventArgs e)
{
Panel myPanel = new Panel();
Panel myPanel = new Panel(); //Wrong
myPanel.BackColor = Color.Red;
myPanel.BackColor = Color.Blue;
}
哪个myPanel
应该变成红色,哪个应该变成蓝色?
这就是为什么变量名必须唯一的原因。这样编译器就可以确定在命名变量时指的是什么东西
这很好:
private void button1_Click(object sender, EventArgs e)
{
Panel myPanel = new Panel(); //OK
richTextBox1.AppendText(myPanel.GetHashCode().ToString() + Environment.NewLine);
}
因为在此范围内只有一个名为myPanel
的变量。从这个意义上说,范围检查是编译时的事情,而不是运行时的事情。您可以在运行时一遍又一遍地在click事件中反复运行代码,.net运行时不会抱怨“您已经在运行使用该变量的代码”。
在编译时,作用域中的所有变量名在所有适用的作用域中必须唯一(一个作用域可以在另一个作用域内,并且外部作用域的变量也不能在内部作用域内重复):< / p>
void MethodX(){
int a = 1;
if(someBoolean){
int a = 2; //wrong; a is already declared
}
}
努普指出,方法范围变量可以重复类范围变量的名称:
class Y{
int a = 1;
void MethodX(){
int a = 1; //it's acceptable to repeat the name but..
a++; //refers to the A declared in the method
this.a++; //refers to the A declared in the class
}
}
但是真的;帮自己一个忙,避免这样做