如何“释放”实现IDispose的成员变量?

时间:2019-08-22 13:50:09

标签: c#

我正在使用代表数据库表的第三方类Table。 该类具有Close()方法,并实现IDispose。

我发现在这样的表上多次调用Close()很好。 同样,多次调用Dispose()也可以。

但是,如果我调用Dispose(),我将无法再次调用Close(),否则将得到ObjectDisposedException。

我想使用此类表作为类中的私有成员变量。

Table类提供者提供的样本不会在表上调用Dispose()。 但是,由于调用Dispose()后再调用Close()会导致崩溃,因此我认为Dispose()会进行完全清理吗?

因此,我得出结论,我必须先调用Close(),然后调用Dispose()一次?

实现此目标的最佳方法是什么? 我应该让我的类实现IDispose并使用Dispose模式和一个bool deposited_变量来确保清理仅执行一次,然后在Dispose方法中使用GC.SuppressFinalize吗?

我已经实现了这种模式,并了解了它的工作原理。

但是我对这有多复杂感到困惑。我认为C#代码会比C ++简单。

还有另一种更简单/更好的方法吗?

1 个答案:

答案 0 :(得分:0)

安迪,你好,这里是一个很好的例子IDisposable Interface 它包含如何处置托管和非托管资源。

如果我们用MemoryStream替换Table3rd,则它具有Close和Dispose方法。我们可以做到这一点 Fiddle

using System;
using System.IO;

public class Table3rd : MemoryStream{
};
public class MyTable : IDisposable
{
    public Table3rd Data { get; private set; }

    public MyTable(){
        Data = new Table3rd();
    }

    private bool disposed;

    public void Close()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    public void Dispose(bool disposing)
    {
        if (!disposed)
        {
            try
            {
                if (disposing)
                {
                    Data?.Dispose();
                    disposed = true;
                }
            }
            finally
            {
                Dispose(disposing);
            }
        }
    }

    public void Dispose()
    {
        Close();
    }
}

public class Program
{
    public static void Main()
    {
        var table = new MyTable();
        var data = table.Data;
        var writer = new StreamWriter(data);
        writer.Write("Table data");
        writer.Flush();
        data.Position = 0;
        var reader = new StreamReader(data);
        var mensaje = reader.ReadToEnd();
        Console.WriteLine(mensaje);
        // Too many dispose
        table.Close();
        table.Dispose();
        table.Close();
        table.Dispose();
    }
}

我希望它对您有用。