如何在其他类/窗体调用已填充的List?实例化问题解惑
问题解答
核心问题:实例化是否会创建新对象
每次使用new关键字实例化类(包括List<T>)时,都会创建一个完全独立的新对象实例。你在另一个窗体/类中重新new CustomerList(),得到的是一个全新的、未填充数据的实例,所以dataCustomers会是null。
另外,你的现有代码存在一个隐藏问题:CustomerList类中的dataCustomers字段没有初始化,即使在Form1中调用Add方法也会触发空引用异常,需要先初始化:
public class CustomerList { // 初始化List,避免空引用 public List<Customers> dataCustomers = new List<Customers>(); }
正确调用已填充数据列表的方法
要访问已填充的数据,必须复用同一个CustomerList实例,以下是几种可行方案:
1. 窗体间传递实例
在打开新窗体时,将已填充好的CustomerList实例作为参数传入:
- Form1中打开新窗体的代码:
// Form1中已填充好的实例 CustomerList listCustomers = new CustomerList(); Customers customer = new Customers() { id = 1, name = "Matthew" }; listCustomers.dataCustomers.Add(customer); // 传递实例给Form2 Form2 form2 = new Form2(listCustomers); form2.Show();
- Form2中接收并使用实例:
public class Form2 : Form { private CustomerList _existingCustomerList; // 通过构造函数接收实例 public Form2(CustomerList customerList) { InitializeComponent(); _existingCustomerList = customerList; // 现在可以直接访问已填充的数据 var firstCustomer = _existingCustomerList.dataCustomers.FirstOrDefault(); } }
2. 使用静态成员共享数据
如果需要在整个应用中共享该列表,可以将dataCustomers设为静态字段,这样无需传递实例就能访问:
- 修改
CustomerList类:
public class CustomerList { // 静态字段,全局唯一实例 public static List<Customers> dataCustomers = new List<Customers>(); }
- Form1中填充数据:
Customers customer = new Customers() { id = 1, name = "Matthew" }; CustomerList.dataCustomers.Add(customer);
- 其他窗体/类中直接访问:
// 无需new,直接通过类名访问静态列表 var allCustomers = CustomerList.dataCustomers;
注意:静态成员是全局共享的,多线程环境下需要注意线程安全,同时要关注内存占用问题。
3. 依赖注入(适合复杂项目)
对于规模较大的项目,可以使用依赖注入框架(如Microsoft.Extensions.DependencyInjection)将CustomerList注册为单例服务,确保所有类注入的是同一个实例:
- 注册单例服务:
var services = new ServiceCollection(); services.AddSingleton<CustomerList>(); var serviceProvider = services.BuildServiceProvider();
- 在Form1中获取并填充数据:
var listCustomers = serviceProvider.GetService<CustomerList>(); listCustomers.dataCustomers.Add(new Customers { id = 1, name = "Matthew" });
- 在其他类中注入使用:
public class OtherClass { private CustomerList _customerList; public OtherClass(CustomerList customerList) { _customerList = customerList; } }
内容的提问来源于stack exchange,提问作者Mateus Félix
相关产品推荐
相关产品推荐

