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
被调用并执行它必须做的任何清理工作,这可能也没什么......)而且对于控制器来说,清理东西是很常见的,即使这不是真正的原因,它也很有意义无论如何要做。