泛型类中的析构函数

本文关键字:析构函数 泛型类 | 更新日期: 2023-09-27 18:02:23

我创建了一个泛型DAO工厂。工厂类实现了IDisposable。

我想为这个泛型类创建一个析构函数,这样它就能正确地实现IDisposable。

如何为这个泛型类定义析构函数?它甚至是必要的,或者我应该把IDispoable和析构函数的实现留给它的非泛型基类吗?

泛型类中的析构函数

MCSD认证工具包(考试70-483)第193页的一些关键信息:

destructor≈(几乎等于)base.Finalize(),析构函数被转换成Finalize方法的重写版本,执行析构函数的代码,然后调用基类的Finalize方法。那么它是完全不确定的,你无法知道什么时候会被调用,因为这取决于GC。

如果一个类不包含托管资源和非托管资源,则不需要这样做实现IDisposableor有析构函数

如果类只有托管资源,它应该实现IDisposable,但它没有需要一个析构函数。(当析构函数执行时,您仍然不能确定托管对象存在,所以你不能调用它们的处置方法。)

如果类只有非托管资源,它需要实现idisposable,并且需要一个在程序不调用Dispose的情况下使用析构函数

Dispose方法必须能够安全地运行多次。你可以通过a来实现变量,以跟踪它以前是否运行过。

Dispose方法应该释放托管和非托管资源

析构函数应该只释放非托管资源。(当析构函数执行时不能确定托管对象是否仍然存在,所以无论如何也不能调用它们的处置方法。

释放资源后,析构函数应该调用GC。SuppressFinalize,因此对象可以跳过结束队列

一个具有非托管和托管资源的类的实现示例:

using System;
class DisposableClass : IDisposable
{
    // A name to keep track of the object.
    public string Name = "";
    // Free managed and unmanaged resources.
    public void Dispose()
    {
        FreeResources(true);
    }
    // Destructor to clean up unmanaged resources
    // but not managed resources.
    ~DisposableClass()
    {
        FreeResources(false);
    }
    // Keep track if whether resources are already freed.
    private bool ResourcesAreFreed = false;
    // Free resources.
    private void FreeResources(bool freeManagedResources)
    {
        Console.WriteLine(Name + ": FreeResources");
        if (!ResourcesAreFreed)
        {
            // Dispose of managed resources if appropriate.
            if (freeManagedResources)
            {
                // Dispose of managed resources here.
                Console.WriteLine(Name + ": Dispose of managed resources");
            }
            // Dispose of unmanaged resources here.
            Console.WriteLine(Name + ": Dispose of unmanaged resources");
            // Remember that we have disposed of resources.
            ResourcesAreFreed = true;
            // We don't need the destructor because
            // our resources are already freed.
            GC.SuppressFinalize(this);
        }
    }
}