如何让C#类中对象数组在多个函数间可访问?
解决C# WinForm中跨方法访问对象数组的问题
嘿,我来帮你搞定这个问题!你的核心问题其实是变量作用域混淆加上对C#中static关键字的误用,咱们一步步来修正:
问题根源
- 你在类里声明了
static数组,但这个数组属于Form实例,根本不需要static——static是属于类本身而非实例的,这里用实例字段更合适。 - 构造函数里你重新声明了局部的
appList变量,这就覆盖了类级别的字段!你填充的是局部变量,类的其他方法自然访问不到。
具体修正步骤
- 第一步:把类级别的
appList改成实例字段,去掉static修饰符 - 第二步:构造函数里不要重新声明
appList,直接给类字段赋值
修改后的完整代码
namespace FormsTest1 { public partial class Form1 : Form { public int AppCount; // 改成实例字段,去掉static,建议用private遵循封装原则 private applications[] appList; public Form1() //程序主入口 { IEnumerable<int> apps = VolumeMixer.EnumerateApplications(); AppCount = apps.Count(); int i = 0; // 不要重新声明,直接给类的appList字段赋值 appList = new applications[AppCount]; foreach (int app in apps) { appList[i] = new applications(); appList[i].setProcessID(app); appList[i].populate(); i++; } for (int j = 0; j < AppCount; j++) { ChannelSelect1.Items.Add(appList[j].Name); } } private void ChannelSelect1_SelectedIndexChanged(object sender, EventArgs e) { for (int k = 0; k < AppCount; k++) { // 现在这里访问的就是构造函数里填充的那个数组了 if (ChannelSelect1.Text == appList[k].Name) { Channels[0] = appList[k].PID; } } } public class applications { public int PID; public string ProcessName; public string WindowName; public string Name; public string Path; public void setProcessID(int ID) { PID = ID; } public string getProcessName() { return ProcessName; } public string getWindowName() { return WindowName; } public string getName() { return Name; } public string getPath() { return Path; } public void populate() { //填充逻辑 } } } }
额外建议
- 把
appList的访问修饰符从public改成private,因为它只在Form1内部使用,这样更符合面向对象的封装原则。 - C#里通常用属性(Property)代替传统的get/set方法,比如把
getProcessName()改成public string ProcessName { get; private set; },这样代码更符合C#的编码规范。
内容的提问来源于stack exchange,提问作者ComatoseChimera
相关产品推荐
相关产品推荐

