当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在IDisposable类层次结构中正确处理ObjectDisposedException》经验,为你挑选了1个好方法。

正确实现IDisposable时,大多数实现(包括框架指南)都建议包含一个private bool disposed;成员,以便安全地允许多次调用Dispose(),Dispose(bool)并在适当时抛出ObjectDisposedException.

这适用于单个类.但是,当您从可支配资源中继承子类,并且子类包含其自己的本机资源和唯一方法时,事情会变得有点棘手.大多数示例都展示了如何Dipose(bool disposing)正确覆盖,但不要超出处理范围ObjectDisposedException.

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


第一:

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

1)声明私人布尔处置; 在这两个班级.每个类跟踪它自己的this.disposed,并根据需要抛出.

2)使用protected bool Disposed {get; 私人集; 而不是一个字段.这将让子类检查处置状态.

3)提供一些受保护的辅助方法来检查处理状态,如果对象被处理,则通过反射拉动当前类型名称来抛出.

我看到每个选项的优点是:

1)这对我来说"闻到",因为它包含重复的布尔值,但似乎工作正常.我经常在子类化其他代码时使用它.

2)这取出了重复的布尔值,但不是设计指南书的编写方式等.这是我通常使用的,因为它使状态保持单一点.

3)这对我来说似乎是最干净的选择,但没有出现在标准指南中.对于来自该类用户的其他方法,可能对方法的预期稍差.

在某些方面,我尝试过使用这三种方法.我想知道这三种方法的优点和缺点,以及任何其他想法,以更清洁,更好的方式来处理这个问题.你在处理这个问题时会做出什么选择?为什么?


第二:

抛出时ObjectDisposedException,你对name参数使用了什么?我知道"典型"方法调用是:

throw new ObjectDisposedException(GetType().FullName);

Microsoft员工在此页面上发表评论,建议实施具体类的全名是适当的用法.

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

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



1> Noldorin..:

我通常实现第一个选项.实际上,它似乎是设计指南推荐的内容.原因并不是很明显,但我认为它是一个好的原因:该类的任何实现者都应该具有相同的保护,以防止对象作为一般消费者处置.换句话说,最好不要假设实现派生类的人确切地知道何时可以调用某个方法,其成功执行可能或可能不依赖于对象是否已被处置(尽管理想情况下这应该是无论如何都通过XML注释记录).

关于你的第二个问题,我将再次坚持推荐的传递实践GetType().FullName,特别是因为它在核心.NET框架中使用.即使您认为替代方法更合适,我认为最好坚持使用.NET框架中使用的方法以保持一致性.

总结:与所有指南一样,显然由您决定如何实现某个设计功能,但除非您有特别好的理由,否则坚持使用它们是非常明智的.在这两种情况下,使用您在帖子中建议的一些替代方案可能不会造成很大的伤害,只要它们被一致地使用并且最好记录给用户.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有