如何在Windows窗体上使用IDisposable模式

时间:2014-05-16 00:01:29

标签: c# idisposable

我已在此article上阅读过IDisposable模式,并希望在我的Windows窗体应用程序中实现它。我们知道在windows窗体.Designer.cs类中已经存在Dispose方法

private System.ComponentModel.IContainer components = null;

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

并且在.cs类中我使用Typed Dataset来读取和保存数据。

public partial class frmCustomerList
{
    private MyTypedDataSet ds = new MyTypedDataSet();
    ...
}

那么,如何实现IDisposable来处置MyTypedDataSet?如果我在frmCustomerList中实现IDisposable并实现其接口

public partial class frmCustomerList : IDisposable
{
    private MyTypedDataSet ds = new MyTypedDataSet();
    void Dispose()
    {
       ds.Dispose();
    }
}

.Designer.cs中的Dispose(bool disposing)方法怎么样?

3 个答案:

答案 0 :(得分:4)

如果您查看Designer.cs文件并查看 以下 处置方法,您将看到此

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

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {

只有InializeComponent()被警告不要修改。您可以剪切(不复制)并将protected override void Dispose(bool disposing)粘贴到设计器文件中并将其移到主代码文件中,而不必担心,只需确保离开components.Dispose();部分因为您通过设计师添加的任何一次性物品将被放入该集合中进行处理。

public partial class frmCustomerList
{
    private MyTypedDataSet ds = new MyTypedDataSet();

    protected override void Dispose(bool disposing)
    {
        ds.Dispose();

        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    //The rest of your frmCustomerList.cs file.
}

答案 1 :(得分:3)

我会使用其中一种表单事件处理表单的任何成员,例如

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onclosed(v=vs.110).aspx

e.g

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

    if (ds != null)
        ds.Dispose();
}

答案 2 :(得分:0)

我认为除非您拥有非托管资源,否则您不必关心处理您的课程。这是一个实际有用的例子:

public class ComplexResourceHolder : IDisposable
{

    private IntPtr buffer; // unmanaged memory buffer
    private SafeHandle resource; // disposable handle to a resource

    public IntPtr Buffer { get { return buffer; } set { buffer = value; } }

    public ComplexResourceHolder()
    {
        this.buffer = ... // allocates memory
        this.resource = ... // allocates the resource
    }

    protected virtual void Dispose(bool disposing)
    {
        ReleaseBuffer(buffer); // release unmanaged memory
    if (disposing)
    { 
        // release other disposable objects
        if (resource!= null)
           resource.Dispose();
    }
}

~ ComplexResourceHolder(){
    Dispose(false);
}

public void Dispose(){
    Dispose(true);
    GC.SuppressFinalize(this);
}

}

检查MSDN以更好地理解Dispose(bool)终结器覆盖。关于非托管资源的this link也很有用,因为这是你应该使用IDisposable的第一个原因。

如果类继承了IDisposable:

,您可能想要使用如下所示的结构
using (ComplexResourceHolder crh = new ComplexResourceHolder())
{
    //Do something with buffer for an instance
    //crh.Buffer =
}

关闭标签&#39;}后,将自动调用Dispose方法。