gpt4 book ai didi

c# - 在 IDisposable 类层次结构中正确处理 ObjectDisposedException

转载 作者:可可西里 更新时间:2023-11-01 08:27:15 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




正确实现 IDisposable 时,大多数实现,包括框架指南,都建议包含 private bool disposed;成员,以便安全地允许多次调用 Dispose() , Dispose(bool)以及扔ObjectDisposedException在适当的时候。

这适用于单个类。但是,当您从一次性资源进行子类化,并且子类包含它自己的 native 资源和独特的方法时,事情就会变得有点棘手。大多数示例展示了如何覆盖 Dipose(bool disposing)正确,但不要超出处理 ObjectDisposedException .

在这种情况下,我有两个问题。

第一的:

子类和基类都需要能够跟踪处置状态。我知道有几个主要选项 -

  • 1) 声明私有(private) bool 已处理;在两个类(class)。每个类都跟踪自己的 this.disposed,并根据需要抛出。
  • 2) 使用 protected bool Disposed { get;私有(private)订制; } 而不是一个字段。这将使子类检查已处理的状态。
  • 3) 提供一些 protected 辅助方法来检查释放状态,如果对象被释放,则通过反射拉动当前类型名称来抛出。

  • 我认为每个选项的优点和缺点是:
  • 1)这对我来说“闻起来”,因为它包含重复的 bool 值,但似乎工作正常。我经常在子类化其他代码时使用它。
  • 2) 这去除了重复的 bool 值,但不是设计指南书的编写方式,等等。不过,这是我通常使用的方式,因为它保持状态的单点。
  • 3)这对我来说似乎是最干净的选择,但没有出现在标准指南中。与类(class)用户的其他方法相比,对一种方法的期望可能要低一些。

  • 我曾经尝试过使用所有这三种方法。我想知道这三种方法的优缺点,以及任何其他更清晰、更好的处理方法的想法。你会在处理这个问题时做出什么选择,为什么?

    第二:

    扔时 ObjectDisposedException ,你用什么来命名参数?我知道“典型”方法调用是:
    throw new ObjectDisposedException(GetType().FullName);

    有评论 on this page来自 Microsoft 员工的建议,实现具体类的全名是合适的用法。

    在上面的第三个选项中,这将是唯一有意义的选择。但是,如果该类实现了抛出本身,则您可能会返回定义所调用方法的类的名称。 (即:基类可以返回基类的名称,而不是具体的子类)

    我认为这不是一个好主意 - 但我在其他人编写的一些代码中遇到了这个问题。返回实现方法的类的名称是否有优点或缺点?

    最佳答案

    我通常实现第一个选项。事实上,这似乎是设计指南所推荐的。原因不是很明显,但我认为这是一个很好的原因:该类的任何实现者都应该具有相同类型的保护,以防止将对象作为一般消费者处理的情况。换句话说,最好不要假设实现派生类的人确切地知道他们何时可以调用某个方法,该方法的成功执行可能取决于也可能不取决于对象是否已经被释放(尽管理想情况下这应该是无论如何都通过 XML 注释记录)。
    关于你的第二个问题,我会再次坚持通过 GetType().FullName 的推荐做法。 ,特别是因为它用于核心 .NET 框架。即使您认为替代方法更合适,我认为为了一致性,最好坚持使用 .NET 框架中使用的方法。
    总而言之:与所有指南一样,您希望如何实现某个设计功能显然取决于您,但除非您有特别好的理由,否则强烈建议您坚持使用它们。在这两种情况下,使用您在帖子中建议的某些替代方案可能不会造成太大伤害,只要它们被一致使用并且最好记录给用户。

    关于c# - 在 IDisposable 类层次结构中正确处理 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668440/

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