在一次性模式下呢?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup
GC.SuppressFinalize(this);
}
}
对不起,很抱歉。我的意思是说,如果没有非托管资源,我需要终结器吗?上面的一次性图案不够好吗?是的,即使用户/开发人员不调用处置,GC也不默认调用处置吗?
而GC调用处理和终结器的顺序又如何呢?
请参见
standard dispose pattern? why do we need "disposing" parameter in the virtual method and isn't the finalizer get called after dipose always?
更多细节。
在其他情况下,当我们有终结器时,为什么要使用false作为参数调用Dispose。
从http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2看来,始终建议从终结器而不是托管引用中释放未损坏的资源。
始终建议从Dispose方法释放未损坏的资源...
仍然没有获得总要旨,但仍在阅读文章。
但是,如果没有多余的资源,则以下模式应该有效...
根据msdn.microsoft.com/zh-CN/magazine/cc163392.aspx#S2,msdn.microsoft.com/en-us/library/fs2xkftw.aspx建议在finalizer中释放本机资源,并使用dispose( )。如果显式调用dispose(),则可以抑制finalizer。即如果没有本地资源,我们就不需要fianlizer。
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool suppressFinalize)
{
if (!disposed)
{
//Just do the cleanup
//and release resources
disposed = true;
}
if (!suppressFinalize)
{
GC.SuppressFinalize(this);
}
}
public void Dispose()
// Implement IDisposable
{
Dispose(true);
}
~MyClass() // the finalizer
{
Dispose(false);
}
}
问候,
梦想家
最佳答案
因为您可能直接引用了非托管资源(例如Windows句柄),并且即使没有人调用Dispose
,也希望释放它们。
不过,这种情况非常少见-通常,您实际上只能通过其他托管类型间接引用非托管资源,而托管类型则需要终结器。
关于c# - 如果我的类实现IDisposable,为什么需要终结器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10854801/