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

如何在其他类/窗体调用已填充的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:31:02