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 模式是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章