2013-06-18 24 views
7

私はSystem.Data.SQLiteSQLiteConnectionオブジェクトは2つの類似した方法を所有していることに気づきました。connection.Close()とconnection.Dispose()の違いは何ですか? <code>SQLiteDataReader</code>オブジェクトの</p> <ul> <li><code>Close()</code></li> <li><code>Dispose()</code></li> </ul> <p>同じ:

違いは何ですか?

+3

これはおそらく役に立ちます:http://stackoverflow.com/questions/61092/close-and-dispose-which-to-call – Micha

+0

ありがとう、私はこの記事を見ませんでした! – Epoc

答えて

17

Disposeも閉じていない場合は接続を閉じますが、Closeを呼び出すと、接続を再度開くことができます。これは、接続が破棄されたときには不可能です。一般的に

Closeを呼び出し、単にusingブロックでの接続の作成をラップすることによって暗黙のうちに処分呼び出すことはありません:

using (var connection = new SqlConnection(...)) 
{ 
    // use connection here. 
} // connection gets closed and disposed here. 
+0

[ソース](http://system.data.sqlite.org/index.html/artifact/31b823606b81d72d120bdd8dca8de8421b9abb16)を見てみると、 'Dispose()'が 'Close()'を内部的に呼び出すことが分かります。 – Arran

+0

答えをありがとう(重複して申し訳ありません) – Epoc

+0

@スティーブンはそれを言ったのですか? – Arran

5

Connection.Close()単にサーバーへの接続を閉じます接続文字列で定義されています。この時点でConnectionを使用/再オープンすることができます。

Connection.Dispose()完全にクリーンアップされ、管理対象外のすべてのリソースが削除され、Connectionが再び使用されなくなります。いったん処分されると、もうオブジェクトを使用しないでください。 Dispose(),の中でClose() `もすべて確実に呼び出されます。

私は物事を正しくクリーンアップされていることを確認するため、可能な場合のようなusing使用して構文をお勧めします:

using(SqlLiteConnection conn = new SqlLiteConnection(...)) 
{ 
    // Do work here 
} 

これは自動的に関わらずスローされた例外を、あなたのための接続を処分します。

+2

微妙な違いの1つは、 'Close'はそのコネクション上で' GC.SuppressFinalize'メソッドを呼び出さず、 'Dispose'はそのメソッドを呼び出します。したがって、接続を廃棄しないと、接続オブジェクトはより長く維持されます。これは接続プールには影響しませんが、メモリ上にはあります。しかし、 'SqlConnection'の場合の違いは無視できます。 – Steven

+0

ありがとう、それは私のためにもっと明らかです(重複して申し訳ありません) – Epoc

関連する問題