32

我知道 C# 可以通过其垃圾收集器很好地管理资源。但既然它有,那么它到底是为了什么,为什么需要它?

谁能解释为什么.Dispose()在 asp.net mvc 中需要?

另外,Dispose 连接是什么意思?为什么需要它?任何人都知道为什么像 in 那样处理数据库连接很重要的复杂性db.Dispose()?这是与 EF 相关还是与 SQL Server 相关?我试图确切地理解为什么。

protected override void Dispose(bool disposing)
{
   db.Dispose();
   base.Dispose(disposing);
}
4

1 回答 1

31

Dispose用于释放“非托管”资源(例如,套接字、文件句柄、位图句柄等),并且如果它在终结器之外被调用(这就是disposing标志所表示的,顺便说一句),用于处置它持有的其他 IDisposable 对象更有用。

“非托管”资源不由 CLR 管理(因此得名),GC 不会弄乱它们或自行释放它们;如果没有Dispose方法(以及实际使用它的代码!),它将依赖对象的终结器来清理。最终终结器将运行(如果应用程序运行良好,并且对象具有终结器),并且如果终结器完成了它的工作,那么一切都很好......但是这样做会花时间 - 如果你与此同时,手柄用完了,哦,好吧。对于其他线程/进程/任何需要它们的东西来说太糟糕了。

但是,如果您Dispose,资源会立即释放,并且周围的情况会更好。

(顺便说一下,这不限于 EF、SQL Server 或任何其他技术。Disposable 模式在整个 .net 框架中都可以找到,并且当您拥有不再存在的 IDisposable 时,利用它被认为是一种很好的做法用过的。)

As for why IDisposable is implemented so far up the tree, rather than you just implementing it on a case by case basis...i'm not 100% sure. But imagine you were writing a framework. Consider that if everything weren't an IDisposable, you'd have to check -- every time you wanted to get rid of something! -- whether the object is disposable, and Dispose it if so. If you instead implement IDisposable "just in case", though, things are simplified -- you just always dispose. (If an object doesn't have anything to clean up, it just doesn't override Dispose -- in which case its parent's Dispose被调用并执行它必须做的任何清理工作,这可能也没什么......)而且对于控制器来说,清理东西是很常见的,即使这不是真正的原因,它也很有意义无论如何要做。

于 2012-04-13T02:17:46.613 回答