Jeffry Richter说(在CLR中通过C#Edition 4,P.534 ),实现IDisposable
的类中的所有方法和属性都应该明确抛出ObjectDisposedException
。
这是有道理的,但我从来没有真正看到它在野外完成。
这是一个因为开发人员不知道(或不关心)或者是否比这更复杂而没有遵循的建议?
答案 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允许在处理完成后访问许多成员。因此,如果您以模态方式显示对话框并处理了表单,您仍然可以访问在表单中输入的用户输入。