c# 中最简单的 IDisposable 模式是啥? [复制]

Posted

技术标签:

【中文标题】c# 中最简单的 IDisposable 模式是啥? [复制]【英文标题】:What is the simplest IDisposable pattern in c#? [duplicate]c# 中最简单的 IDisposable 模式是什么? [复制] 【发布时间】:2017-03-29 13:45:35 【问题描述】:

如果我有一个只使用托管资源的类,那么我认为没有必要完全实现 IDisposable 模式。

当然这就足够了:

    public class ManagedResourceClient : IDisposable
    
        private ITheManagedResource _myManagedResource = new TheManagedResource()

        public void Dispose()
        
            if ( _myManagedResource != null )
            
                _myManagedResource.Dispose();
                _myManagedResource = null;
            
         
    

我看不出有什么理由使用:

一个终结器,因为它只使用实现 IDisposable 的托管资源 'disposing' 标志,因为这是由 null 检查处理的 一种虚拟的 Disposing 方法,因为不需要区分 GC 调用和直接调用。

以上可以确认是正确的吗?

【问题讨论】:

这个应用程序是多线程的吗? "我有一个只使用托管资源的类" 那么你可能不需要 dispose @Servy:瞧,下一个无缘无故实现IDisposable的对象 说你有一个继承自 ManagedResourceClient 的类,它使用了许多非托管资源。您再次重新实现 IDisposable !这里使用你的虚拟 Dispose(bool) 方法 OP 您需要提及您是否正在使用非托管资源。如果整个应用程序只使用托管资源,那么不,你不需要它 【参考方案1】:

您几乎拥有它,因为您的类不是密封的,有人可以从您的类派生,并且该派生类也可能需要处置一个对象。使您的课程密封,您当前的实现就可以了。

public sealed class ManagedResourceClient : IDisposable

    private ITheManagedResource _myManagedResource = new TheManagedResource()

    public void Dispose()
    
        if ( _myManagedResource != null )
        
            _myManagedResource.Dispose();
            _myManagedResource = null;
        
     

如果您想了解有关处置的更多信息(以及为什么 Microsoft 给出的带有终结器的股票示例实际上是一个糟糕的示例),请参阅 Stepen Cleary 的这篇非常好的文章:“IDisposable: What Your Mother Never Told You About Resource Deallocation”

【讨论】:

好的,谢谢,如果没有密封,我需要做什么? @user183872 将 Dispose 设为虚拟或将受保护的 Dispose 函数设为虚拟(将受保护的函数设为“标准”处置模式) 你也应该确保阅读这篇文章,基本上它解释了为什么你永远不需要在你的类中有一个终结器,除非你的类派生自SafeHandle。您将逻辑分为两种类型,一种只处理单个非托管对象(类型 0),另一种只处理类型 0 或其他类型 1 对象(类型 1)。 @Scott - Dispose 模式是否真的发生了错误? (除了 .dispose 没有被程序员调用)——文章中的这些东西是现实世界的问题还是理论上的问题? @Cato 您将看到的主要现实情况是,如果您要生成大量寿命短的一次性物品,则通过在一次性物品上安装终结器,您的对象将永远无法被收集为Gen 0 垃圾收集的一部分,因为当你被添加到终结器队列时,拥有终结器会导致你被提升一个 teir。当您有很多寿命很短的一次性物品时,这可能会导致明显的性能问题。

以上是关于c# 中最简单的 IDisposable 模式是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#中的IDisposable模式用法详解

使用 IDisposable 模式在 C# 中同步对资源的访问的方法

c#中最有效的循环是啥

深入理解C#中的IDisposable接口

C# 中的单例是啥?

C#中IDisposable的用法