.net 我应该何时抛出'ObjectDisposedException'?

.net 我应该何时抛出'ObjectDisposedException'?,.net,clr,.net,Clr,Jeffry Richter说(在CLR中通过C#Edition 4,第534页)实现IDisposable的类中的所有方法和属性都应该显式抛出ObjectDisposedException 这是有道理的,但我从来没有在野外看到过 这是因为开发人员不知道(或不关心)而没有遵循的建议,还是比这更复杂?当您的类型的成员无法运行时,您可以显式抛出它,因为它所依赖的资源已被释放 在许多情况下,您的类型可能正在包装IDisposable实例。在这种情况下,您只需调用包装好的IDisposable实例的成

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

这是有道理的,但我从来没有在野外看到过


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

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

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

  • 但在某些情况下,您可能希望明确地抛出它。例如,如果Dispose方法将包装的IDisposable实例设置为null,则需要显式抛出execption,因为您不再有可将其委托给的实例

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

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

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

  • 我认为杰弗里·里克特(Jeffrey Richter)关于IDisposable类的所有成员在处置时都应该抛出的建议没有意义。IDisposable类框架中有很多示例,这些类的成员在释放时不会抛出。例如

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

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


似乎很多框架类只有在调用需要特定资源的方法(或属性)时才会抛出它,而这些资源在释放时不再可用。例如,如果您试图写入一个封闭的套接字,它们当然会抛出。但是,如果您只设置已处理的
文本框的
ForeColor
,他们似乎认为异常太多了(尽管实际上在设置颜色后,应该重新绘制,这应该会引发…但不会)。作为一个例子,他似乎肯定会放弃这一点。但所有方法/属性都可能是过于强烈的建议。例如,大多数指南建议您应该允许多个
Dispose
调用,而允许调用者确定对象当前状态的属性通常不受欢迎。@Damien_不信者是的,当然
Dispose
本身应该引发任何异常。让所有调用者显式地检查状态让人感觉非常嘈杂和心痛,特别是当多个线程正在工作时。如果对已处置的对象执行任何操作,天空中的饼图(pie in the sky,正确的解决方案)会让CLR抛出异常吗?我想不出有哪一个实例可以有效地执行
get
@RenéVogt感觉有点像
应用程序异常
。好主意,但没有跟进。DirectorySearcher允许您在处理目录后使用它来搜索目录。精彩的!