我应该什么时候抛出 ObjectDisposedException ?
When should I throw `ObjectDisposedException`?
Jeffry Richter 说(in CLR via C# Edition 4, P.534)class 中实现 IDisposable
的所有方法和属性都应该抛出ObjectDisposedException
明确。
这是有道理的,但我从来没有真正看到它在野外完成。
这个建议是因为开发人员不知道(或不关心)而没有被遵循,还是比这更复杂?
当你的类型的成员因为它依赖的资源被释放而无法运行时,你可以显式地抛出它。
在许多情况下,您的类型可能包装了一个 IDisposable 实例。在这种情况下,您可以简单地调用包装的 IDisposable 实例的成员,并让它负责抛出 ObjectDisposedException
.
但有些情况下你想显式抛出它。例如,如果您的 Dispose 方法将包装的 IDisposable 实例设置为 null,您将需要显式抛出执行,因为您不再有实例可以委托给它。
或者如果您的 IDisposable class 直接拥有一个非托管资源,如果非托管资源已被释放,则需要显式抛出 ObjectDisposedException。
最后,在调用包装的 IDisposable 成员之前执行重要逻辑的成员可能想要 "fail fast",并抛出 ObjectDisposedException 而不是不必要地执行此类逻辑。
不依赖包装的 IDisposable 实例或非托管资源的成员不需要抛出 ObjectDisposedException,如果不这样做更合适的话。
我认为 Jeffrey Richter 关于 IDisposable class 的 所有 成员在处理时应该抛出的建议没有道理。 IDisposable classes 框架中有大量示例,其中的成员在处置时不会抛出。例如
FileStream.Name
会将 return 名称传递给 FileStream 的构造函数,即使 FileStream 已被释放,因为它不需要访问流 return名字.
A System.Windows.Form 在它被释放后将允许访问许多成员。因此,如果您以模态方式显示对话框并处理表单,您仍然可以访问在表单中输入的用户输入。
Jeffry Richter 说(in CLR via C# Edition 4, P.534)class 中实现 IDisposable
的所有方法和属性都应该抛出ObjectDisposedException
明确。
这是有道理的,但我从来没有真正看到它在野外完成。
这个建议是因为开发人员不知道(或不关心)而没有被遵循,还是比这更复杂?
当你的类型的成员因为它依赖的资源被释放而无法运行时,你可以显式地抛出它。
在许多情况下,您的类型可能包装了一个 IDisposable 实例。在这种情况下,您可以简单地调用包装的 IDisposable 实例的成员,并让它负责抛出
ObjectDisposedException
.但有些情况下你想显式抛出它。例如,如果您的 Dispose 方法将包装的 IDisposable 实例设置为 null,您将需要显式抛出执行,因为您不再有实例可以委托给它。
或者如果您的 IDisposable class 直接拥有一个非托管资源,如果非托管资源已被释放,则需要显式抛出 ObjectDisposedException。
最后,在调用包装的 IDisposable 成员之前执行重要逻辑的成员可能想要 "fail fast",并抛出 ObjectDisposedException 而不是不必要地执行此类逻辑。
不依赖包装的 IDisposable 实例或非托管资源的成员不需要抛出 ObjectDisposedException,如果不这样做更合适的话。
我认为 Jeffrey Richter 关于 IDisposable class 的 所有 成员在处理时应该抛出的建议没有道理。 IDisposable classes 框架中有大量示例,其中的成员在处置时不会抛出。例如
FileStream.Name
会将 return 名称传递给 FileStream 的构造函数,即使 FileStream 已被释放,因为它不需要访问流 return名字.A System.Windows.Form 在它被释放后将允许访问许多成员。因此,如果您以模态方式显示对话框并处理表单,您仍然可以访问在表单中输入的用户输入。