【发布时间】:2014-07-05 07:27:53
【问题描述】:
问大家一个问题。
在我的公司,我们正在开发一个在 Microsoft 的 MVC 框架内运行的应用程序。 我们正在实现的控制器类继承自 MVC 基类 Controller。示例:
public class MyController: Controller
{
protected bool IsDisposed { get; set; }
… various methods…
}
我们在团队中的讨论围绕 Dispose() 模式展开。本质上,这涉及到实现 IDisposable 接口,最好根据 Microsoft 认可的模式。
例如看这个链接:http://msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs.110%29.aspx
有趣的是,我们的控制器类不拥有任何资源,无论是托管的还是托管的。这样一来,Dispose(bool) 的实现就大大简化了:
protected override void Dispose(bool disposing)
{
IsDisposed = true;
base.Dispose(disposing);
}
对于IsDisposed属性的使用(或需要)存在一些分歧,在以下方法中使用:
protected void ThrowIfDisposed()
{
if (IsDisposed) throw new ObjectDisposedException(“MyController”);
}
然后在每个“真正”工作的方法开始时调用此方法。这里的想法是不应再次使用已处理的对象,因此它应该抛出 ObjectDisposedException。另一种观点是,由于Dispose(bool)“什么都不做”(除了设置IsDisposed属性并在基类上调用Dispose(bool)),“disposed”对象并没有真正处于不可用的状态,所以没有理由扔。因此,甚至没有理由实现Dispose(bool)。
反对这一点的一个论点是 MyController 应该在它被释放并调用它的一个方法时抛出,以便在将来的版本中添加托管和/或非托管资源时它的行为不会改变。
反对最后一点的论点是 MyController 不应该在未来的版本中添加任何资源,而是应该从未来需要添加资源的情况下派生出来。另一个问题是:为什么(库)类 Controller 不实现 ThrowIfDisposed() 或类似的东西?
所以,综上所述,派系一想实现Dispose(bool)和ThrowIfDisposed()如上图,派系二认为它们没有必要并想取消它们。
我在这两种观点中都看到了优点,无法真正下定决心。意见?
【问题讨论】:
标签: c# dispose objectdisposedexception