C# 什么';在.NET中重写Dispose(bool disposing)的目的是什么?
如果我用C#编写一个实现IDisposable的类,为什么它不足以让我简单地实现C# 什么';在.NET中重写Dispose(bool disposing)的目的是什么?,c#,.net,dispose,idisposable,C#,.net,Dispose,Idisposable,如果我用C#编写一个实现IDisposable的类,为什么它不足以让我简单地实现 public void Dispose(){ ... } 释放任何非托管资源 是 总是必要的,有时是必要的,还是其他什么?布尔处理的附加方法来自某个框架设计指南。它只是一种模式,允许类多次调用dispose方法而不引发异常。这不是绝对需要的。从技术上讲,您可以使用dispose方法来执行此操作 严格来说这不是必要的。这是推荐的一次性模式的一部分。如果您还没有阅读框架设计指南部分(第一版中的9.3,第二版手边没有
public void Dispose(){ ... }
释放任何非托管资源
是
总是必要的,有时是必要的,还是其他什么?布尔处理的附加方法来自某个框架设计指南。它只是一种模式,允许类多次调用dispose方法而不引发异常。这不是绝对需要的。从技术上讲,您可以使用dispose方法来执行此操作 严格来说这不是必要的。这是推荐的一次性模式的一部分。如果您还没有阅读框架设计指南部分(第一版中的9.3,第二版手边没有),那么您应该 区分一次性清理和可终结的垃圾收集很有用,但这会毁了我
你不必这样做,但你应该仔细阅读并理解为什么建议这样做,然后再将其视为不必要。MSFT文档中有一点关于一次性模式的偏见。您应该实现IDisposable的原因有两个:
只有情况2需要一次性模式。微软需要经常使用它。大多数情况下,您只需要简单的Dispose()。包括终结器、引入新的虚拟方法和“密封”原始Dispose方法在内的完整模式非常通用,涵盖了所有基础 除非在非托管资源上有直接句柄(应该是),否则不需要终结器 如果你密封你的类(我关于密封类的观点现在可能已经广为人知了),那么引入虚拟方法就没有意义了 我不记得上次我是什么时候以“复杂”的方式实现了
IDisposable
,而不是以最明显的方式实现的,例如
public void Dispose()
{
somethingElse.Dispose();
}
需要注意的一点是,如果您想要获得真正健壮的代码,那么应该确保在处理完之后不要尝试做任何事情,并在适当的地方抛出
ObjectDisposedException
。对于世界各地的开发人员都将使用的类库来说,这是一个很好的建议,但是如果这只是一个在您自己的工作区中使用的类,那么这将是一个非常多的工作,收获甚微。除了其他很好的答案之外,您可能还想查看以下文章:
- (一次性设计原则)
哦,当我们在这个领域的时候:你的类上处理来自其他类的事件的方法必须是“安全的”,以防在你的类被释放后被调用。最简单的方法是,如果该类被释放,只执行一个no-op。请参见它提供给您的一个功能是在Dispose()中执行与终结无关的工作,并且仍然可以清理非托管资源 在终结器中对托管对象执行除“您自己”之外的任何操作都是非常。。。不可预知的这主要是由于您的终结器将在AppDomain的第2阶段关闭时以非确定性的方式被调用,因此当您的终结器被调用时,您仍然有引用的对象极有可能已经被终结 将Dispose和finalizer调用分派到同一个方法允许您共享关闭代码,而布尔参数允许您跳过托管清理(如果有)
此外,该方法的虚拟性为继承者添加自己的清理代码提供了一种简单的方法,从而减少了无意中不调用您的代码的风险。如果类实现了
IDisposable.Dispose()
,并且派生类需要添加额外的逻辑,该类必须公开派生类可以链接到的某种Dispose
方法。由于某些类可能实现IDisposable.Dispose()
而没有公共的Dispose()
方法,因此在IDisposable
的所有实现中,拥有一个受保护的虚拟方法非常有用,无论它们是否有公共的Dispose
方法。在大多数情况下,bool
参数不是真正有意义的参数,但应将其视为伪参数,以使受保护的虚拟处置(bool)
与可能是或可能不是公共的Dispose()
具有不同的签名
不使用受保护的虚拟处置(bool)
的类将需要派生类以不同于约定的方式处理其清理逻辑。一些语言,如C++/CLI,仅用于扩展IDisposable
实现
public void Dispose()
{
somethingElse.Dispose();
}