为什么在 asp.net MVC 控制器中需要显式 Dispose() 方法?谁能解释它的复杂性?(具体 asp.net
本文关键字:net asp 方法 具体 复杂性 能解释 控制器 MVC 为什么 Dispose | 更新日期: 2023-09-27 18:30:52
我知道C#可以用它的垃圾回收器很好地管理资源。但既然它有这个,这到底是为了什么,为什么需要它?
谁能解释为什么 asp.net MVC 需要.Dispose()
?
另外,释放连接意味着什么?为什么需要它?任何人都知道为什么像db.Dispose()
那样处理数据库连接很重要的复杂性?这是与 EF 相关还是与 SQL Server 相关?我试图理解确切的原因。
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
Dispose
用于释放"非托管"资源(例如,套接字、文件句柄、位图句柄等),如果它在终结器外部被调用(这就是disposing
标志的含义,顺便说一句),用于释放它持有的其他不再有用的 IDisposable 对象。
"非托管"资源不是由 CLR 管理的(因此得名),GC 不会弄乱它们或自行释放它们;如果没有Dispose
方法(以及实际使用它的代码!),它将依靠对象的终结器来清理。 最终终结器将运行(如果应用程序运行正常,并且对象具有终结器),如果终结器完成其工作,则一切正常。但它需要它的甜蜜时间 - 如果你在此期间用完了手柄,哦,好吧。 对于其他线程/进程/任何需要它们的线程/进程来说太糟糕了。
但是,如果您Dispose
,资源会立即释放,并且周围情况会更好。
(顺便说一下,这不限于 EF、SQL Server 或任何其他技术。 一次性模式在整个 .net 框架中随处可见,只要您有一个不再使用的 IDisposable,就认为利用它是一种很好的做法。
至于为什么IDisposable
在树上实现这么多,而不是你只是根据具体情况实现它......我不是100%确定。 但是想象一下你正在编写一个框架。 考虑一下,如果一切都不是 IDisposable,你必须检查 - 每次你想摆脱一些东西!-- 对象是否是一次性的,如果是,Dispose
。 但是,如果您改为"以防万一"实现 IDisposable,事情就会简化 - 您总是处理。 (如果一个对象没有任何要清理的内容,它就不会覆盖Dispose
- 在这种情况下,它的父Dispose
被调用并执行它必须进行的任何清理,这可能也没什么...... 对于控制器来说,有东西要清理是很常见的情况,即使这不是真正的原因,无论如何都有很多意义。