gpt4 book ai didi

.net - 我应该什么时候抛出 `ObjectDisposedException` ?

转载 作者:行者123 更新时间:2023-12-05 04:06:17 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com