Windows窗体销毁后,其创建的List<T>及元素能否存续?
嘿,这个场景我太熟了,咱们把问题拆解开说清楚哈:
窗体B销毁后,私有List的存续问题
1. 能不能存续?
当然能!
这里的核心是.NET的垃圾回收(GC)规则:对象会不会被回收,看的是有没有活跃的引用指向它,和它原本所属的类(窗体B)是否被销毁完全没关系。
你这个场景里,B把私有List
2. 存续时长多久?
- 只要A还活着(比如A是主窗体,一直在运行),并且A手里还握着这个List的引用,那List就会一直存在,你随时可以用它。
- 直到A本身被销毁,同时没有任何其他对象再持有这个List的引用时,GC才会在合适的时机把它回收掉。
3. 需要满足哪些条件?
- A必须持有List的有效引用:比如要把事件参数里的List赋值给A的成员变量(比如
private List<T> _receivedData;),不能只在事件处理方法的局部变量里用——局部变量在方法执行完就会被销毁,那List就可能被GC回收。 - 不要手动在B里销毁List:别在B的
Dispose方法里把私有List设为null或者做清理操作,只要A已经拿到了引用,B里的引用失效完全不影响A手里的那份。 - List里的对象本身没有被其他已销毁的对象绑定死引用:不过这个一般不用操心,只要A持有List,里面的对象也会跟着被引用,不会被单独回收。
给你贴个简单的代码示例更直观:
// 窗体A的代码 public class FormA : Form { // A自己保存List的成员变量 private List<MyDataModel> _savedData; private void OpenFormB() { using (var formB = new FormB()) { formB.DataSubmitted += FormB_DataSubmitted; if (formB.ShowDialog() == DialogResult.OK) { // 此时formB已经销毁,但_savedData已经拿到了List引用 } } } private void FormB_DataSubmitted(object sender, DataSubmittedArgs e) { // 把事件里的List存到A的成员变量,持有引用 _savedData = e.SubmittedList; } // 之后A的任意方法都能正常使用_savedData private void UseData() { if (_savedData != null) { foreach (var item in _savedData) { // 处理数据 } } } } // 窗体B的代码 public class FormB : Form { // B的私有List private List<MyDataModel> _privateDataList; public event EventHandler<DataSubmittedArgs> DataSubmitted; private void SubmitButton_Click(object sender, EventArgs e) { // 填充私有List的数据 _privateDataList = new List<MyDataModel>(); // ... 假设这里做了数据填充 // 触发事件把List传给A DataSubmitted?.Invoke(this, new DataSubmittedArgs(_privateDataList)); DialogResult = DialogResult.OK; Close(); } } // 自定义事件参数类 public class DataSubmittedArgs : EventArgs { public List<MyDataModel> SubmittedList { get; } public DataSubmittedArgs(List<MyDataModel> list) => SubmittedList = list; }
内容的提问来源于stack exchange,提问作者Ozan Yasin Dogan
相关产品推荐
相关产品推荐

