泛型类中的析构函数
本文关键字:析构函数 泛型类 | 更新日期: 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);
}
}
}