我必须在处理之前closures()一个SQLConnection吗?

在这里关于一次性对象的其他问题 ,我们应该在使用块结束之前调用Close()吗?

using (SqlConnection connection = new SqlConnection()) using (SqlCommand command = new SqlCommand()) { command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)"; command.CommandType = System.Data.CommandType.Text; connection.Open(); command.ExecuteNonQuery(); // Is this call necessary? connection.Close(); } 

由于您有一个使用块,因此将调用SQLCommand的Dispose方法,并closures连接:

 // System.Data.SqlClient.SqlConnection.Dispose disassemble protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); } 

从.NETreflection器反汇编SqlConnection:

 protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); } 

它在Dispose()中调用Close()

using关键字将正确closures连接,因此不需要额外调用Close。

从SQL Server连接池的MSDN文章:

“我们强烈build议您在完成使用后始终closures连接,以便将连接返回到池中。可以使用Connection对象的Close或Dispose方法,或打开在C#中使用语句

使用.NET Reflector的SqlConnection.Dispose的实际实现如下所示:

 // System.Data.SqlClient.SqlConnection.Dispose disassemble protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); } 

不,在SqlConnection上调用Dispose()也会调用Close()。

MSDN – SqlConnection.Dispose()

使用Reflector ,你可以看到SqlConnectionDispose方法实际上调用了Close() ;

 protected override void Dispose(bool disposing) { if (disposing) { this._userConnectionOptions = null; this._poolGroup = null; this.Close(); } this.DisposeMe(disposing); base.Dispose(disposing); } 

不,使用Using块无论如何都会调用Dispose() ,所以不需要调用Close()

不,在调用Dispose之前没有必要closures连接。

一些对象(如SQLConnections)可以在调用Dispose之后重新使用,但不能在调用Dispose之后使用。 对于调用Close的其他对象与调用Dispose相同。 (我认为ManualResetEvent和Streams的行为是这样的)

不,SqlConnection类从IDisposableinheritance,当遇到使用结束(对于连接对象)时,它会自动调用SqlConnection类上的Dispose。