什么时候应该抛出`ObjectDisposedException`?

时间:2018-04-24 13:58:44

标签: .net clr

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

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

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

1 个答案:

答案 0 :(得分:2)

当您的类型的成员无法运行时,您可以显式抛出它,因为它所依赖的资源已被处理。

  • 在许多情况下,您的Type可能正在包装IDisposable实例。在这种情况下,您只需调用包装的IDisposable实例的成员,并让它负责抛出ObjectDisposedException

  • 但是有时候你想明确地抛出它。例如,如果Dispose方法将包装的IDisposable实例设置为null,则需要显式抛出该execption,因为您不再有实例将其委派给它。

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

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

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

  • 我不认为杰弗里里希特的建议是,当处置有意义时,所有成员都应该抛弃IDisposable类。在IDisposable类的框架中有很多例子,它们的成员在处理时不会抛出。 E.g。

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

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