121

Disposable objects に関する私の他の質問によると、using ブロックの終了前に 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();
}
4

8 に答える 8

112

using ブロックがあるため、SQLCommand の 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);
}
于 2009-07-28T18:26:16.823 に答える
26

.NET Reflectorを使用した 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() を呼び出します

于 2009-07-28T18:28:07.413 に答える
22

usingキーワードは接続を正しく閉じるため、Closeを追加で呼び出す必要はありません。

SQL Server接続プールに関するMSDNの記事から:

「接続がプールに戻されるように、使用が終了したら常に接続を閉じることを強くお勧めします。これは、ConnectionオブジェクトのCloseメソッドまたはDisposeメソッドを使用するか、内部のすべての接続を開くことで実行できます。 C#でステートメントを使用する」

.NETReflectorを使用した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);
}
于 2009-10-30T17:56:56.783 に答える
5

Reflectorを使用すると、 のDisposeメソッドがSqlConnection実際にClose();を呼び出すことがわかります。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}
于 2009-07-28T18:29:59.093 に答える
4

いいえ、SqlConnection で Dispose() を呼び出すと、Close() も呼び出されます。

MSDN-SqlConnection.Dispose()

于 2009-07-28T18:23:45.020 に答える
3

いいえ、とにかく Using ブロックが呼び出さDispose()れるので、呼び出す必要はありませんClose()

于 2009-07-28T18:23:48.483 に答える
2

いいえ、Dispose を呼び出す前に接続を閉じる必要はありません。

一部のオブジェクト (SQLConnections など) は、Close を呼び出した後に再利用できますが、Dispose を呼び出した後は再利用できません。他のオブジェクトの場合、Close を呼び出すことは Dispose を呼び出すことと同じです。(ManualResetEvent と Streams はこのように動作すると思います)

于 2009-07-28T18:26:10.833 に答える
1

いいえ、SqlConnection クラスは IDisposable を継承しており、(接続オブジェクトの) 使用が終了すると、SqlConnection クラスの Dispose が自動的に呼び出されます。

于 2009-07-28T18:23:45.190 に答える