Eya*_*hem 3 c# ado.net sqlconnection
如果我丢失了对包含与数据库的开放连接的对象的引用,那么当GC清理我的对象时(即通过析构函数SqlConnection class),连接是否已关闭?
或者是否导致连接泄漏?
它Dispose不在析构函数(Finalize)中关闭.所以使用using-statement,你是安全的.
很难找到文档(不依赖于反编译程序集)但最后我发现它SqlConnection.Close:
如果SqlConnection超出范围,则不会关闭.因此,您必须通过调用Close或Dispose显式关闭连接.关闭和处置在功能上是等效的.
....
以下示例创建一个SqlConnection,打开它,显示其一些属性.连接在使用块结束时自动关闭.
此外:
警告
不要在类的Finalize方法中对Connection,DataReader或任何其他托管对象调用Close或Dispose.在终结器中,您应该只释放您的类直接拥有的非托管资源.如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法.
来源(ILSpy,.NET 4):
// System.Data.SqlClient.SqlConnection
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close(); // <-------
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)