.net 我应该何时抛出'ObjectDisposedException'?
Jeffry Richter说(在CLR中通过C#Edition 4,第534页)实现.net 我应该何时抛出'ObjectDisposedException'?,.net,clr,.net,Clr,Jeffry Richter说(在CLR中通过C#Edition 4,第534页)实现IDisposable的类中的所有方法和属性都应该显式抛出ObjectDisposedException 这是有道理的,但我从来没有在野外看到过 这是因为开发人员不知道(或不关心)而没有遵循的建议,还是比这更复杂?当您的类型的成员无法运行时,您可以显式抛出它,因为它所依赖的资源已被释放 在许多情况下,您的类型可能正在包装IDisposable实例。在这种情况下,您只需调用包装好的IDisposable实例的成
IDisposable
的类中的所有方法和属性都应该显式抛出ObjectDisposedException
这是有道理的,但我从来没有在野外看到过
这是因为开发人员不知道(或不关心)而没有遵循的建议,还是比这更复杂?当您的类型的成员无法运行时,您可以显式抛出它,因为它所依赖的资源已被释放
- 在许多情况下,您的类型可能正在包装IDisposable实例。在这种情况下,您只需调用包装好的IDisposable实例的成员,让它负责抛出
ObjectDisposedException
- 但在某些情况下,您可能希望明确地抛出它。例如,如果Dispose方法将包装的IDisposable实例设置为null,则需要显式抛出execption,因为您不再有可将其委托给的实例
- 或者,如果IDisposable类直接拥有非托管资源,则如果非托管资源已被释放,则需要显式抛出ObjectDisposedException
- 最后,在调用包装的IDisposable成员之前执行重要逻辑的成员可能希望“快速失败”,并抛出ObjectDisposedException,而不是不必要地执行此类逻辑
- 不依赖包装IDisposable实例或非托管资源的成员不需要抛出ObjectDisposedException,如果不这样做更合适的话
- 我认为杰弗里·里克特(Jeffrey Richter)关于IDisposable类的所有成员在处置时都应该抛出的建议没有意义。IDisposable类框架中有很多示例,这些类的成员在释放时不会抛出。例如
将返回传递给FileStream的构造函数的名称,即使文件流已被释放,因为它不需要访问流来返回名称FileStream.Name
- System.Windows.Form将允许在释放后访问多个成员。因此,如果您以模式显示了一个对话框并处理了表单,您仍然可以访问表单中输入的用户输入
文本框的ForeColor
,他们似乎认为异常太多了(尽管实际上在设置颜色后,应该重新绘制,这应该会引发…但不会)。作为一个例子,他似乎肯定会放弃这一点。但所有方法/属性都可能是过于强烈的建议。例如,大多数指南建议您应该允许多个Dispose
调用,而允许调用者确定对象当前状态的属性通常不受欢迎。@Damien_不信者是的,当然Dispose
本身应该引发任何异常。让所有调用者显式地检查状态让人感觉非常嘈杂和心痛,特别是当多个线程正在工作时。如果对已处置的对象执行任何操作,天空中的饼图(pie in the sky,正确的解决方案)会让CLR抛出异常吗?我想不出有哪一个实例可以有效地执行get
@RenéVogt感觉有点像应用程序异常
。好主意,但没有跟进。DirectorySearcher允许您在处理目录后使用它来搜索目录。精彩的!