IDisposable究竟需要什么?

phi*_*131 1 c# memory idisposable base-class

可能重复:
正确使用IDisposable接口

我试图通过书籍,互联网和stackoverflow找到我的问题的实际答案,但到目前为止没有任何帮助我,所以希望我可以说明我的问题足够有意义.

一般来说,我总是找到与如何释放内存相同的基本用法,即约.如下,我确实理解代码本身:

public class MyClass : IDisposable
{
    bool disposed = false;
    public void Dispose()
    {
        if (!disposed)
        {
        Dispose(true);
        GC.SuppressFinalize(this);
        disposed = true;
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
        //free managed ressources
        }
    // free other ressources
    }

    ~MyClass()
    {
        Dispose(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

它完全理解方法的工作方式.但现在我的问题是:为什么我们需要基类IDisposable?在此代码示例,我们定义了一个名为方法Dispose().当我到处读到该方法是IDisposable的一部分时,我们刚刚定义了该方法MyClass,如果我们不实现基类IDisposable或者我错误的假设,这段代码仍然有用吗?

我对C#并不是全新的,但我仍然需要学习很多东西,所以希望有人可以带领我朝着正确的方向前进.我检查了另一篇同样问题的帖子,但找不到它,所以如果它确实存在且它确实回答了我的问题,请带我到那里,我将删除这篇文章.

Céd*_*non 8

你是对的,因为你的析构函数~MyClass调用Dispose,似乎不需要接口IDisposable.

但是Dispose只有析构函数才会调用它.当您希望处理非托管资源时,可以在代码中自己调用它.这是必需的,因为您不知道何时调用析构函数(由垃圾收集器决定).

最后,IDisposable.Dispose当你使用a时调用using.

using(MyDisposableClass myObject = new MyDisposableClass())
{
    // My Code
}
Run Code Online (Sandbox Code Playgroud)

相当于:

MyDisposableClass myObject = new MyDisposableClass();
try
{
    // My Code
}
finally
{
    myObject.Dispose();
}
Run Code Online (Sandbox Code Playgroud)