.net - 我应该什么时候抛出 `ObjectDisposedException` ?

标签 .net clr

Jeffry Richter 说(在 CLR via C# Edition 4, P.534)实现 IDisposable 的类中的所有方法和属性都应该抛出 ObjectDisposedException明确地。

这是有道理的,但我从未真正看到它在野外完成。

这个建议是因为开发人员不知道(或不关心)而没有被遵循,还是比这更复杂?

最佳答案

当您的类型的成员由于其依赖的资源被处置而无法运行时,您可以显式抛出它。

  • 在许多情况下,您的类型可能会包装一个 IDisposable 实例。在这种情况下,您可以简单地调用包装的 IDisposable 实例的成员,并让它负责抛出 ObjectDisposedException

  • 但有些情况下您可能想显式抛出它。例如,如果您的 Dispose 方法将包装的 IDisposable 实例设置为 null,您将需要显式抛出执行,因为您不再有实例可以委托(delegate)给它。

  • 或者,如果您的 IDisposable 类直接拥有一个非托管资源,它需要在非托管资源已被释放时显式抛出 ObjectDisposedException。

  • 最后,在调用包装的 IDisposable 成员之前执行重要逻辑的成员可能希望“快速失败”,并抛出 ObjectDisposedException 而不是不必要地执行此类逻辑。

  • 如果不依赖包装的 IDisposable 实例或非托管资源的成员不需要抛出 ObjectDisposedException 更合适的话。

  • 我认为 Jeffrey Richter 关于 IDisposable 类的所有 成员在处置时应该抛出的建议没有道理。 IDisposable 类框架中有大量示例,这些示例具有在处置时不抛出的成员。例如

    • FileStream.Name 将返回传递给 FileStream 的构造函数的名称,即使 FileStream 已被释放,因为它不需要访问流来返回名称。

    • System.Windows.Form 在被释放后将允许访问许多成员。因此,如果您以模态方式显示对话框并处理表单,您仍然可以访问在表单中输入的用户输入。

关于.net - 我应该什么时候抛出 `ObjectDisposedException` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50003609/

相关文章:

c# - 从左到右编号坐标和拉绳

.net - 使用 Google.Api OAuth 2 时拒绝访问路径 'C:\Windows\system32\config\systemprofile'

memory - .NET 应用程序的合理内存量是多少?

.net - 为什么有针对 .Net 的调试和发布版本,但没有针对 Java 的版本?

c# - 为什么 'unbox.any' 不像 'castclass' 那样提供有用的异常文本?

c# - 使用静态构造函数(Jon Skeet 脑筋急转弯)

.net - 海量数据快速可视化的方法

c# - 在 Compact Framework 中更改文件 LastWriteDate

c# - 从 C# 中定义的 COM 类返回成功代码

c# - 为什么向 void 返回方法添加返回类型会导致 MissingMethodException