这是我所了解的有关IDisposable和终结器从"CLR通过C#"、"有效C#"资源和其他资源:

  • IDisposable被清理的管理及非管理的资源明确地.
  • 类责任不受管理资源(例如文件处理)应当实施IDisposable,并提供一个终结,以保证他们清理了,即使如果客户的代码不叫Dispose()上的实例。
  • 类负责管理的资源仅应该永远不会实现一个终结.
  • 如果你有一个终结,那么你必须实现IDisposable(这可以让客户代码做正确的事情并呼吁Dispose(),同时终结防止泄漏资源,如果他们忘记).

虽然我理解的理由,并同意与所有上述,有一种情况,我认为很有意义,打破这些规则:一个单独的类,负责非管理资源(例如提供一个单一的访问点,特别是文件)。

我认为这是永远错误的,有一个Dispose()方法上的一个单独因为单一实例应该居住生活的应用程序,如果任何客户代码的电话Dispose()然后你都塞满。但是,你想要一个终结,以便在应用程序载的终结可以清除不受管理的资源。

所以具有一个单独的类有一个终结,不实现IDisposable对我来说似乎是一个合理的事情要做,但这种类型的设计是反对我的理解是最好的做法。

这是一个合理的做法?如果没有,为什么以及什么是最优质的替代品?

有帮助吗?

解决方案

如果不受管理的资源被释放,只有在申请出你甚至都不需要担心有一个终结,因为该进程卸载应该处理这个对你无论如何。

如果你有多个应用程序域和你想要处理的一个应用程序域卸载这是一个可能的问题,但可能是一个不需要你关心。

我的第二那些说这个设计可能是不正确的做法(并将使它更难解决是后来你发现你做的实际需要的两个实例) 创建的对象(或懒散装包装对象)在入境点和通过它通过代码需要的地方明确负责提供人,然后你可以自由改变决定使用唯一一个有点影响到其他代码(即采用什么它得到定)

其他提示

我第一提的是面向对象的设计模式及其后果并不总是影响每一种语言的决定,即使在面向对象的语言。你当然可以找到经典的设计图案,更易于实现以一种语文(一般)作为反对另一种(C++)。

这就是说,我不知道我同意的前提下,一个单一实例只应当布置在结束一个应用程序。什么的设计图案说明,我已经阅读 单独 (或 设计图案:元素可重复使用面向对象软件)提及这样一个酒店的这一模式。单独应该确保只有一个类的实例存在任何一个时刻时的时间;这并不意味着它必须存在,只要该程序的存在。

我有一种感觉,在实践中,许多单身确实存在对于大多数生活中的一个应用程序。然而,考虑应用程序使用的一个TCP通信连接服务器,但也可以存在一个断模式。在连接时,你会希望有一个单独的维持连接的信息和国家的连接。一旦断开,你可能希望保持同一单独或者你可以处分该单例。虽然有些人可能认为,它使得更有意义,以保持单身(而我甚至可能是其中之一),没有什么的设计图案本身就排除了你自处理它的-如果一个连接是重拍,单独的实例化可以再次,因为没有实例,它的存在那个时刻。

换句话说,您可以创建的情况这是合乎逻辑对于单身人士有IDisposable.

只要你的终结不会调用的方法(例如处置)其他任何管理对象,你应该好。只要记住,最终确定了不确定性的。也就是说,如果你单独对象Foo拥有一个参考的对象吧,需要处理,则无法可靠地写:

~Foo()
{
    Bar.Dispose();
}

垃圾收集器可能已经收集的酒吧。

在风险,进入一堆OO咕(即开始战争),一个替代使用一个单一实例是使用静类。

虽然它可能会让你代码审查的抱怨和FxCop警告,没有什么本质上是错误的与执行一个终结,而不IDisposable.但是,这样做在一个单独的不是一个可靠的方式捕获的进程或程序域撕下来。

在本风险提供主观的设计建议:如果对象是真正的无国籍,使其成为一个静态的类。如果它是全状态的问题,为什么它是一个单一实例:你是创造一个可变的全球变量。如果你试图捕捉应用程序的接近,处理它当你的主循环中退出。

适用单独的任何特殊情况搁置,

我认为没有什么错处理单例。在结合与懒惰的实例,它只是意味着你释放的资源,如果你不需要它是暂时的,然后重新获得它作为必要的。

如果你想要建立一个单独有一个终结,你应该可能有静态的参考,它是一个WeakReference.这将需要一点小小的额外工作以确保线的安全访问,但是它会允许单独进行垃圾回收时,没有人是使用它(如果有人随后呼吁GetInstance()方法,它们会得到一个新的实例)。如果一个静态的强参考使用,它将继续单独的实例还活着,即使没有其他提到它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top