跨越方法的C#范围

时间:2011-08-17 01:12:01

标签: c# scope

刚刚遇到了一些关于对象范围的问题。我在表单声明中定义了一些面板:

        public Form1()
    {
        InitializeComponent();

        Panel[] panels = new Panel[10];

        for (int i=0;i<10;i++)
        {
            //Panel newPanel = new Panel();
            panels[i] = new Panel();
            panels[i].Size = new Size(40, 37);
            panels[i].BackgroundImage = imageList1.Images[0];
            panels[i].Location = new Point(i * 20, i * 20);
            this.Controls.Add(panels[i]);
        }

    }

但是,当我尝试在刻度方法中使用这些面板(更改图像或移动它们)时,我得到了

  

当前上下文中不存在名称“panel”

以下是获取错误消息的行

        private void PanelMoveTimer_Tick(object sender, EventArgs e)
    {
        if (panels[0].Location.X >= 0)

我必须调用它们吗?或者宣布他们是公开的?我如何让他们可以访问?

4 个答案:

答案 0 :(得分:4)

声明表单类中的面板,而不是它的构造函数。

 private Panel[] _panels = new Panel[10];

 public Form1()
    {
        InitializeComponent();               

        for (int i=0;i<10;i++)
        {
            //Panel newPanel = new Panel();
            _panels[i] = new Panel();
            _panels[i].Size = new Size(40, 37);
            _panels[i].BackgroundImage = imageList1.Images[0];
            _panels[i].Location = new Point(i * 20, i * 20);
            this.Controls.Add(_panels[i]);
        }

    }

答案 1 :(得分:1)

Locals变量是方法的本地变量,不可用于不同的变量。如果要在对象的方法中使用值,最简单的方法是使其成为字段。

class Form1 { 
  Panel[] panels;

  public Form1() {
    this.panels = new Panel[10];
    ...
  }
}

答案 2 :(得分:0)

问题在于这一行:

Panel[] panels = new Panel[10];

因为你在那里定义了Panel数组,它只在构造函数的范围内可用,IE那个Form1()方法。

你需要做的是,至少是:

Panel[] panels = new new Panel[10];

public Form1()
{
   InitializeComponent();
   ...

这样,面板将可用于该类的所有非静态方法。

答案 3 :(得分:0)

一种简单的方法是将范围视为包含变量声明的最近的括号。变量可以在这些大括号之间的任何位置访问。

因此,当你在构造函数中声明'panel'时,它只能在构造函数中访问;如果你在类中声明它,它将可以在任何类方法中访问。

public class Form1 : Form
{ //Beginning of the 'panels' scope
  Panels[] panels;

  public Form1()
  {
    InitializeComponent();
    panels = new Panel[10]; // initialization in constructor
  }

  private void PanelMoveTimer_Tick(object sender, EventArgs e)
  {
      if (panels[0].Location.X >= 0) // usage in method
        ..
  }
}