C# FormClosing和FormClosed的区别

本文详细介绍了FormClosing和FormClosed两个窗体关闭事件的区别及应用。FormClosing事件允许开发者取消窗体关闭操作,并能重写DialogResult的值;而FormClosed事件则用于窗体完全关闭后进行一些必要的清理工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FormClosing事件

在窗体关闭时,FormClosing事件发生。此事件会得到处理。从而释放与窗体相关的所有资源。

如果取消此事件,则窗体仍然保持打开状态。

当窗体显示为模式对话框时,单击“关闭”会隐藏窗体并将DialogResult属性设为Cancel。

通过在些事件中设置DialogResult属性可以在用户单击右上角关闭按钮时重写DialogResult的值。

FormClosed事件

在用户或Application类的Close方法或Exit方法关闭窗体后,会发生FormClosed事件。

可以使用此事件释放窗体的一些资源。还可以使用此事件保存输入窗体中的一些信息或者更新父窗体。

### C# WinForms 中 `Close` `Dispose` 方法的区别 #### 定义与作用 在 C# WinForms 开发中,`Close` `Dispose` 是两个用于释放资源的方法,但它们的作用范围触发时机有所不同。 - **`Close` 方法** 调用窗体的 `Close` 方法会关闭当前窗体实例并触发一系列事件链。这包括调用窗体的 `FormClosing` `FormClosed` 事件[^4]。当窗体被关闭时,其生命周期结束,并可能进一步调用内部对象的 `Dispose` 方法来清理未托管资源。 - **`Dispose` 方法** `Dispose` 方法主要用于显式释放由类持有的未托管资源(如文件句柄、网络连接等)。它是 .NET 的 IDisposable 接口的一部分,通常通过实现 `IDisposable` 来定义如何释放这些资源。对于控件或窗体而言,调用 `Dispose` 不仅会销毁该对象本身,还会递归地对其子控件调用 `Dispose`。 #### 实现机制 两者的底层实现存在显著差异: - 当调用 `Close` 时,它实际上会在适当的时候间接调用 `Dispose`,但这取决于具体的上下文环境以及窗体的设计模式。例如,在 MDI 子窗体中,父容器可能会阻止某些情况下自动执行 `Dispose` 操作。 - 对于 `Dispose`,一旦手动调用了此方法,则无论任何条件都会立即清除关联的对象及其依赖项。这意味着如果过早调用可能导致其他部分程序无法正常访问已处置的数据结构或设备接口。 #### 使用场景比较 | 特性 | `Close` | `Dispose` | |--------------------|----------------------------------|---------------------------------| | 主要用途 | 关闭窗口 | 显式释放资源 | | 是否触发事件 | 是 (FormClosing/FormClosed) | 否 | | 自动回收行为 | 可能会调用 Dispose | 总是彻底摧毁目标对象 | | 常见应用场景 | 用户交互结束后退出某个对话框 | 需要在特定时刻强制释放内存时 | 需要注意的是,在实际编码过程中应当遵循良好的实践原则——即只应在必要时候才直接操作 `Dispose`;而大多数日常需求都可以依靠标准流程中的 `Close` 函数完成相应任务。 ```csharp // 示例代码展示 Close Dispose 的区别 public partial class MainForm : Form { private ChildForm child; public MainForm() { InitializeComponent(); this.child = new ChildForm(); // 创建一个子窗体实例 this.child.Show(); // 展示这个子窗体 } protected override void OnFormClosing(FormClosingEventArgs e){ base.OnFormClosing(e); if(this.child != null && !this.child.IsDisposed){ this.child.Close(); // 正确做法:先尝试优雅地关闭子窗体 // 如果需要立刻释放所有资源可以用下面一句代替: // this.child.Dispose(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值