Microsoft状态,"如果SqlConnection超出范围,它将不会关闭"。我一点也不明白。SqlConnection是一个ADO.NET托管的对象,即使它在后台使用非托管资源,那么垃圾回收器为什么不清理它呢?当它超出范围时,它应该被销毁。有人能解释一下吗,这让我伤透了脑筋。
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close%28v=vs.110%29.aspx
感谢
SqlConnection在完成时被释放。之所以会发生这种情况,是因为它继承了Component,后者有一个调用Dispose的终结器。终结是垃圾收集中的一个步骤。垃圾回收是不确定地运行的,也就是说,只要CLR觉得这样。C#中的垃圾回收与超出范围的对象完全无关。
因此,如果SqlConnection超出范围,它将在未来的某个时刻被最终确定并关闭。这很糟糕,因为在完成之前,你是在浪费资源。在程序的后期,您可能无法打开连接,因为已经打开了太多的连接(即使它们实际上没有使用,只是在等待最终确定)。
这就是为什么强烈建议您在使用完SqlConnections之后对其进行处置。
(不要把这看作是SqlConnection终结工作的典型真理。我简化了细节,以便重点关注终结和显式处理之间的区别)。