c#跨方法作用域

本文关键字:作用域 方法 | 更新日期: 2023-09-27 18:05:42

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

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

然而,当我试图使用这些面板在一个tick方法(改变图像或移动它们),我得到

名称'panels'在当前上下文中不存在

这是得到错误消息

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

我一定要调用它们吗?或者将它们声明为公共的?如何使它们可访问?

c#跨方法作用域

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

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

Locals变量是一个方法的局部变量,在其他方法中不可用。如果您希望跨对象的方法使用一个值,最简单的方法是将其作为一个字段。

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

问题出在这一行:

Panel[] panels = new Panel[10];

因为你在那里定义了Panel数组,它只在构造函数的作用域中可用,即Form1()方法。

你需要做的,至少是这样:

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

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

一种简单的方法是将作用域视为封闭变量声明的最近的大括号。该变量可以在括号之间的任何地方访问。

所以,当你在构造函数中声明面板时,它只能在构造函数中访问;如果在类中声明它,则可以在任何类方法中访问它。

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
        ..
  }
}