c# - 如果我的类实现了 IDisposable,为什么还需要终结器?

标签 c# .net c#-3.0

下面的一次性模式呢?

using System;
public class MyClass : IDisposable 
{     
    public void Dispose() 
        // Implement IDisposable     
    {
        //just do the cleanup
        GC.SuppressFinalize(this);
    } 

} 

更新

我的意思是,如果没有非托管资源,我还需要终结器吗?上面的一次性图案还不够好吗?是的,即使用户/开发人员不调用 dispose,默认情况下 GC 不调用 dispose 吗?

那么 GC 调用处置器和终结器的顺序又如何呢?

请参阅this question了解更多详情。

换句话说,当我们有终结器时,为什么我们调用 Dispose 并以 false 作为参数?


来自 http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2 ,看起来总是建议从终结器而不是托管引用释放非托管资源。

始终建议从 Dispose 方法释放非托管资源。阅读这篇文章时,我仍然没有完全理解要点。

但是如果没有非托管资源,下面的模式应该可以工作。


根据 msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2,msdn.microsoft.com/en-us/library/fs2xkftw.aspx 建议在终结器中释放 native 资源以及所有资源与处置()。如果显式调用 dispose(),它可以抑制终结器,即如果没有本地资源,我们不需要终结器。

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/

相关文章:

c# - 在asp.net中创建一个基本类

c# - 构建我的类(class)的正确方法

c# - Entity Framework 代码第一个子导航属性 null

.net - 升级到 .NET 4.0 的一些主要原因是什么?

c# - 静态只读字段初始化程序与静态构造函数初始化

c# - 如何在 C# 中不使用 Wix 安装 BHO

c# - WPF MultiBinding 到 Model.ChildProperty 不起作用?

c# - Jenkins REST API 获取作业和作业控制台日志

c# - 找不到命名空间或类(ASP.NET 网站 "project")

.net - 从 C# 切换到 VB.Net