关闭窗体时是否可以避免销毁类实例以实现在主窗体中复用?
实例不被子窗体关闭销毁的实现方法
完全可以避免实例被销毁,出现该问题的核心原因是实例的唯一引用被绑定到了子窗体的生命周期,或者子窗体销毁时主动释放了该实例,可通过以下方案解决:
- 主窗体持有实例的根引用
在主窗体内将实例定义为成员变量,而不是仅在打开子窗体时临时创建后传递。子窗体仅持有该实例的临时引用,只要主窗体不销毁、不主动置空该成员变量,GC就不会回收该实例。
示例(以C# WinForm为例):
// 主窗体类内定义成员变量存储实例 private CustomClass _sharedInstance; // 仅在主窗体初始化实例 private void MainForm_Load(object sender, EventArgs e) { _sharedInstance = new CustomClass(); } // 打开子窗体时传递引用 private void OpenSubFormBtn_Click(object sender, EventArgs e) { SubForm subForm = new SubForm(); // 给子窗体传入主窗体持有的实例引用 subForm.ReceiveInstance(_sharedInstance); subForm.ShowDialog(); // 子窗体关闭后,_sharedInstance仍可正常使用 }
- 禁止子窗体销毁时释放公共实例
不要在子窗体的FormClosing事件、Dispose方法中对传入的公共实例执行释放、置空操作,子窗体销毁时仅清理自身独占的资源即可。 - 静态变量托管全局实例
如果该实例需要在整个应用生命周期内跨多个窗体复用,可以用静态变量存储,完全脱离单个窗体的生命周期限制:
// 全局静态类存储公共实例 public static class AppResource { public static CustomClass SharedCustomInstance { get; set; } } // 主窗体初始化时赋值 AppResource.SharedCustomInstance = new CustomClass();
- 特殊场景适配:值类型传参
如果你使用的是值类型(struct)而非引用类型(class),子窗体默认拿到的是值副本,关闭后副本消失属于正常情况,主窗体的原实例不受影响。如果需要子窗体的修改同步到原实例,可将类型改为class,或者传参时添加ref关键字。
内容的提问来源于stack exchange,提问作者Islom Makhsudov
相关产品推荐
相关产品推荐

