Jeffry Richter 说(在 CLR via C# Edition 4, P.534)实现 IDisposable
的类中的所有方法和属性都应该抛出 ObjectDisposedException
明确地。
这是有道理的,但我从未真正看到它在野外完成。
这个建议是因为开发人员不知道(或不关心)而没有被遵循,还是比这更复杂?
最佳答案
当您的类型的成员由于其依赖的资源被处置而无法运行时,您可以显式抛出它。
在许多情况下,您的类型可能会包装一个 IDisposable 实例。在这种情况下,您可以简单地调用包装的 IDisposable 实例的成员,并让它负责抛出
ObjectDisposedException
。但有些情况下您可能想显式抛出它。例如,如果您的 Dispose 方法将包装的 IDisposable 实例设置为 null,您将需要显式抛出执行,因为您不再有实例可以委托(delegate)给它。
或者,如果您的 IDisposable 类直接拥有一个非托管资源,它需要在非托管资源已被释放时显式抛出 ObjectDisposedException。
最后,在调用包装的 IDisposable 成员之前执行重要逻辑的成员可能希望“快速失败”,并抛出 ObjectDisposedException 而不是不必要地执行此类逻辑。
如果不依赖包装的 IDisposable 实例或非托管资源的成员不需要抛出 ObjectDisposedException 更合适的话。
我认为 Jeffrey Richter 关于 IDisposable 类的所有 成员在处置时应该抛出的建议没有道理。 IDisposable 类框架中有大量示例,这些示例具有在处置时不抛出的成员。例如
FileStream.Name
将返回传递给 FileStream 的构造函数的名称,即使 FileStream 已被释放,因为它不需要访问流来返回名称。System.Windows.Form 在被释放后将允许访问许多成员。因此,如果您以模态方式显示对话框并处理表单,您仍然可以访问在表单中输入的用户输入。
关于.net - 我应该什么时候抛出 `ObjectDisposedException` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50003609/