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)
我一定要调用它们吗?或者将它们声明为公共的?如何使它们可访问?
在表单的类中声明面板,而不是在它的构造函数中。
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
..
}
}