Windows Forms下释放资源的正确做法

By | 2023年12月29日

有时候需要在Windows Forms中加入一些实现了IDisposable接口的类型,然而会有这样的疑惑:应该在何时调用这些类型的Dispose方法?

第一种方式是在窗体的OnClosed事件处理函数重载中调用,比如:

class MyComponent : IDisposable
{
}

class Form1 : Form
{
    private readonly MyComponent _component = new();
    
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnClosed(EventArgs e)
    {
        _component.Dispose();
        base.OnClosed(e);
    }
}

另一种更为优雅的做法是,在窗体的构造函数中,初始化Container对象,然后把实现了IDisposable接口的类的实例,添加到Container中:

class Form1 : Form
{
    private readonly MyComponent _component = new();
    
    public Form1()
    {
        InitializeComponent();
        components = new Container();
        components.Add(_component);
    }
}

在Windows Forms中,Form的代码实现为部分类(partial class),在窗体设计器自动生成的代码中,已经定义了components对象:

private System.ComponentModel.IContainer components = null;

而在Form的Dispose方法中,会调用components的Dispose方法:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

所以,只需确保components对象已经被初始化,然后把需要Dispose的对象放在components里就可以了,Form在被Dispose的时候,就会自动调用我们的Dispose方法。

(总访问量:64;当日访问量:1)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据