实例的本质是什么?

时间:2019-10-24 13:49:03

标签: c#

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);
    }

1 个答案:

答案 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
  }
}

但是真的;帮自己一个忙,避免这样做