我想问一下这个使用模式SuppressFinalize
。假设我有一个Foo
存储某种资源的对象。该对象Foo
负责释放分配的资源。我总是使用这种方法:
一个类Foo
总是使用释放资源的内部方法来实现finalize
和方法。dispose
调用时dispose
,我总是调用SuppressFinalize
该方法(为了优化垃圾收集过程——不需要将此对象存储在终结队列中,或者,例如,如果我忘记显式调用dispose
该方法)。
这种方法有什么performance
缺点吗?我不明白这种方法是否会产生任何“副作用”——例如,gc
此类对象将始终放置在终结队列中
更新:用法示例(用 C++/Cli 编写 -CleanResources
未使用复选框,因为没有托管字段)
NativeWrapper::NativeWrapper(void) :
m_native(new Native())
{
}
NativeWrapper::~NativeWrapper(void)
{
CleanResources();
System::GC::SuppressFinalize(this);
}
NativeWrapper::!NativeWrapper(void)
{
CleanResources();
}
void NativeWrapper::CleanResources(void)
{
delete m_native;
}
我没有看到任何性能方面的缺点。唯一的缺点是
IDisposable
它必须是幂等的,即必须可以调用Dispose
两次。对于您来说,这目前会导致双重释放内存,因此添加标志也是有意义的isDisposed
。即使你在你的代码中使用
using
,客户端仍然可以随时调用GC.ReRegisterForFinalize
,这将导致调用Finalize
后仍然发生Dispose
。(此处提供了对实现的详细概述
IDisposable
,包括自定义包装器。)