0

このコードを検討してください:

1-...
2-{
  3-...
  4-SqlConnection cn=new SqlConnection();
  5-... 
6-}

プログラムがステートメント No.6 に達した場合、cn処分しますか? そうでない場合、cn変数に何が起こったのですか?

4

5 に答える 5

5

プログラムがステートメントNo.6に到達した場合、cnは破棄しますか?

いいえ。

そうでない場合、cn変数はどうなりましたか?

後で使うかどうかによります。使用せず、スコープ外の場合は、ガベージコレクションの対象になります。このガベージコレクションが発生すると、制御できなくなります。しかし、それが発生すると、それ自体がDisposeメソッドを呼び出すデストラクタが呼び出されます。

これは正しいアプローチであると言われていますが、常にIDisposableリソースをusingステートメントでラップすることです。これにより、例外がスローされた場合でも、Disposeメソッドが常に呼び出されるようになります。

2-{
  3-...
  4-using (SqlConnection cn=new SqlConnection())
    {
        ...
    }
    5-... 
6-}
于 2012-06-17T10:21:06.247 に答える
2

いいえ、GarbageCollectorが破棄することを決定したときに破棄されます。

それを破棄したい場合は、usingステートメントを使用します(SqlConnection実装としてIDisposeable):

using(SqlConnection cn = new SqlConnection())
{
    // code
}
于 2012-06-17T10:21:43.487 に答える
2

いいえ、変数がスコープ外になると、オブジェクトは破棄されません。

オブジェクトが使用されなくなったとき (スコープ内のどこかで、変数を使用する最後の行の後)、オブジェクトはガベージ コレクションの対象になります。

次にガベージ コレクターが実行されると、オブジェクトが使用されていないことがわかりますが、Finalizeメソッドがあり、破棄されていないこともわかります。そのため、オブジェクトはファイナライザー キューに追加されます。また、オブジェクトは収集されないため、メモリ内のある場所から別の場所にオブジェクトを実際に移動することを含む、次のヒープ世代に移動される可能性があります。

ガベージ コレクターには、最終的にオブジェクトをファイナライズするファイナライザー キューからオブジェクトをファイナライズする特別なスレッドがあります。オブジェクトのメソッドは、データベース接続を閉じるメソッドFinalizeを呼び出します。Dispose

オブジェクトが破棄された後、最終的にはガベージ コレクターによって収集されます。

オブジェクトが特定の時間内にファイナライズされるという保証はなく、まったくファイナライズされないことに注意してください

したがって、接続オブジェクトを破棄しない場合、次の 2 つの主なことが起こります。

  • 接続がいつ閉じられるかを制御することはできません。
  • オブジェクトのファイナライズは、Dispose を直接呼び出すよりもはるかにコストのかかるプロセスです。
于 2012-06-17T10:29:32.783 に答える
1

Usingステートメントを使用する必要がありますが、結果は破棄されないのと同じになり、使い捨てとしてマークされ、GCは次回の実行時にそれを収集します。

于 2012-06-17T10:22:13.143 に答える
0

いいえケレゾ、

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 ブロックを使用すると、オブジェクトは自動的に破棄されます。

于 2012-06-18T12:15:15.333 に答える