You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C#类中对象数组在多个函数间可访问?

解决C# WinForm中跨方法访问对象数组的问题

嘿,我来帮你搞定这个问题!你的核心问题其实是变量作用域混淆加上对C#中static关键字的误用,咱们一步步来修正:

问题根源

  1. 你在类里声明了static数组,但这个数组属于Form实例,根本不需要static——static是属于类本身而非实例的,这里用实例字段更合适。
  2. 构造函数里你重新声明了局部的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:15