gpt4 book ai didi

C# IDisposable 模式和抛出 ObjectDisposedException

转载 作者:太空狗 更新时间:2023-10-29 22:32:09 33 4
gpt4 key购买 nike

给大家一个问题。

在我的公司,我们正在开发一个在 Microsoft 的 MVC 框架内运行的应用程序。我们正在实现的 Controller 类继承自 MVC 基类 Controller。示例:

public class MyController: Controller
{
protected bool IsDisposed { get; set; }
… various methods…
}

我们在团队中的讨论围绕着 Dispose() 模式展开。从本质上讲,这涉及实现 IDisposable 接口(interface),最好是根据 Microsoft 认可的模式。

例如,请参见此链接:http://msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs.110%29.aspx

有趣的是,我们的 Controller 类不拥有任何资源,无论是被管理的还是被管理的。结果,大大简化了 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() ,如上所示,派系二认为它们是不必要的并希望取消他们。

我看到了两种观点的优点,无法真正下定决心。意见?

最佳答案

Interestingly, our controller classes do not own any resources, either managed or managed.

那么你就不需要 IDisposable 模式了。

This method [ ThrowIfDisposed() ] is then called at the beginning of every method that does “real” work.

这里的问题是:为什么?

如果您确实想要跟踪可用/废弃状态,那么不要将其称为 IsDisposed。

why doesn’t the (library) class Controller implement ThrowIfDisposed() or something similar?

因为它没有用。

回到开头:为什么有人认为这是必要的?它有什么用?
看来你可以把它撕掉。

关于C# IDisposable 模式和抛出 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584092/

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