c# - 正确处理单例 IDisposable 对象

标签 c# .net

场景:

应用程序实例化实现了 IDisposable 的类的单个实例。该实例通过静态成员公开,使其可供应用程序的所有部分访问。单个实例需要在应用程序的生命周期内保持事件状态。

问题

在应用程序关闭和进程终止之前调用 Dispose 方法有多重要?

我一直认为在大多数像这样的场景中,没有必要调用Dispose,因为进程的终止自然会清理资源。我错了吗?

最佳答案

如果“您的应用程序关闭”是指进程正在终止,那么您技术上不需要做任何事情。您的进程正在终止,操作系统将释放这些资源。

我想它们可能是一些模糊的极端情况,其中某些组件可能会创建某种类型的文件或其他资源,如果未调用 Dispose,则不一定会被清理,即使您进程终止。

我想举一个例子,尽管这是一个奇怪的极端情况。假设您在代码中引用并使用了一个组件。当您创建和使用它时,它会在您的机器上创建一个 2GB 的文件。现在让我们更进一步,说这个组件实际上关闭了文件句柄本身访问这个 2GB 文件在它使用期间的某个时候,由于错误或只是糟糕的设计。现在,此对象上的 Dispose 方法清理了此文件,但没有详细记录。本质上,缺少对此的 Dispose 调用将在机器上留下一个文件。这绝对是一个极端情况,不会导致您的机器“泄漏”任何东西,但您确实有一个 2GB 的文件就在那里。

话虽这么说 - 最佳做法是在确定性地完成资源处理后调用 Dispose。您可以在 Singleton 上调用一个方法 - 让我们说 Cleanup() - 它可以在您关闭时运行。

关于c# - 正确处理单例 IDisposable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594205/

相关文章:

c# - 在 C# 中将 ANSI (Windows 1252) 转换为 UTF8

c# - 在 C# 中以独占模式打开文件

.net - 如何在Silverlight中调用COM打印组件

.net - 当我将变量设置为新对象时,旧值会消失吗?

c# - 公共(public)语言运行时使用 ClickOnce 检测到无效程序

c# - wcf 服务(REST 或 SOAP 或 WEB API)接受任何结构的任何数据

c# - Xamarin.Forms:自定义 ListView 单元格的数据绑定(bind)

c# - 生成 UML 图的库

c# - 从 .NET 调用带有 WS Security 的 Web 服务

.net - 哪种泛型参数约束组合将使 C# 编译器为 GenericParamConstraint 元数据表生成行?