Microsoft声明,“如果SqlConnection超出范围,则不会关闭”。我根本不明白这一点。 SqlConnection是一个ADO.NET 托管对象,即使它在幕后使用非托管资源,为什么垃圾收集器不清理它?当它超出范围时,它应该被销毁。有人可以对此有所了解,它正在打破我的大脑。
由于
答案 0 :(得分:1)
当最终确定时,会释放SqlConnection。发生这种情况是因为它继承自Component has a finalizer that calls Dispose。最终化是垃圾收集的一个步骤。垃圾收集非确定性地运行,即每当CLR感觉像它时。 Garbage collection in C# is totally unrelated to an object going out of scope
因此,如果SqlConnection超出范围,它将在未来的某个时刻完成并因此关闭。这很糟糕,因为在最终确定之前,你就是在浪费资源。稍后在您的程序中,您可能无法打开连接,因为已经打开了太多连接(即使它们实际上没有使用,只是等待最终确定)。
这就是为什么强烈建议您在使用完SqlConnections后处置它们。
(不要将其视为SqlConnection终结的工作原理。我简化了细节,以便专注于最终化和显式处理之间的区别。)