我应该什么时候抛出 ObjectDisposedException ?

When should I throw `ObjectDisposedException`?

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

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

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

当你的类型的成员因为它依赖的资源被释放而无法运行时,你可以显式地抛出它。

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

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

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

  • 最后,在调用包装的 IDisposable 成员之前执行重要逻辑的成员可能想要 "fail fast",并抛出 ObjectDisposedException 而不是不必要地执行此类逻辑。

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

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

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

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