このコードを検討してください:
1-...
2-{
3-...
4-SqlConnection cn=new SqlConnection();
5-...
6-}
プログラムがステートメント No.6 に達した場合、cn
処分しますか? そうでない場合、cn
変数に何が起こったのですか?
プログラムがステートメントNo.6に到達した場合、cnは破棄しますか?
いいえ。
そうでない場合、cn変数はどうなりましたか?
後で使うかどうかによります。使用せず、スコープ外の場合は、ガベージコレクションの対象になります。このガベージコレクションが発生すると、制御できなくなります。しかし、それが発生すると、それ自体がDispose
メソッドを呼び出すデストラクタが呼び出されます。
これは正しいアプローチであると言われていますが、常にIDisposable
リソースをusing
ステートメントでラップすることです。これにより、例外がスローされた場合でも、Disposeメソッドが常に呼び出されるようになります。
2-{
3-...
4-using (SqlConnection cn=new SqlConnection())
{
...
}
5-...
6-}
いいえ、GarbageCollectorが破棄することを決定したときに破棄されます。
それを破棄したい場合は、using
ステートメントを使用します(SqlConnection
実装としてIDisposeable
):
using(SqlConnection cn = new SqlConnection())
{
// code
}
いいえ、変数がスコープ外になると、オブジェクトは破棄されません。
オブジェクトが使用されなくなったとき (スコープ内のどこかで、変数を使用する最後の行の後)、オブジェクトはガベージ コレクションの対象になります。
次にガベージ コレクターが実行されると、オブジェクトが使用されていないことがわかりますが、Finalize
メソッドがあり、破棄されていないこともわかります。そのため、オブジェクトはファイナライザー キューに追加されます。また、オブジェクトは収集されないため、メモリ内のある場所から別の場所にオブジェクトを実際に移動することを含む、次のヒープ世代に移動される可能性があります。
ガベージ コレクターには、最終的にオブジェクトをファイナライズするファイナライザー キューからオブジェクトをファイナライズする特別なスレッドがあります。オブジェクトのメソッドは、データベース接続を閉じるメソッドFinalize
を呼び出します。Dispose
オブジェクトが破棄された後、最終的にはガベージ コレクターによって収集されます。
オブジェクトが特定の時間内にファイナライズされるという保証はなく、まったくファイナライズされないことに注意してください。
したがって、接続オブジェクトを破棄しない場合、次の 2 つの主なことが起こります。
Usingステートメントを使用する必要がありますが、結果は破棄されないのと同じになり、使い捨てとしてマークされ、GCは次回の実行時にそれを収集します。
いいえケレゾ、
1-...
2-{
3-...
4-SqlConnection cn=new SqlConnection();
5-...
6-}
コンパイラーは、ステートメント cn object is not destroy.You can't access the "cn" object from the loop. に到達します。
Using ブロックを使用すると、オブジェクトは自動的に破棄されます。