0

「New」キーワードの使用法とオブジェクトの複数のインスタンスの削除についていくつか質問があります。

サブルーチンが実行されるたびに、このようなコード ビハインド ASP.Net ステートメント内のサブルーチンが実行される場合、employeeDetails.DataKeyNames のインスタンスが多数存在しますか? このオブジェクトは、サブルーチンに対してローカルです。

employeeDetails.DataKeyNames = New String() {"EmployeeID"} 

答えが「はい」の場合、このコードを含むサブルーチンが終了したときに、employeeDetails.DataKeyNames のすべてのコピーを削除するコードを使用する必要がありますか? その場合、ぶら下がっている employeeDetails.DataKeyNames のすべてのコピーを削除するために必要なコーディングを示してください。

4

2 に答える 2

2

アプリケーションで作成するオブジェクト参照は、予想される通常のスコープ規則に従います。たとえば、メソッド内でオブジェクト参照を作成すると、メソッドが呼び出し元に制御を返すまで存在しません。ループ内で参照を作成するForと、その参照はそのループのみのスコープになります。ただし、参照が指していたオブジェクトがすぐになくなるわけではありません。.NET などの管理された環境では、ガベージ コレクターは、オブジェクトがそれを指す参照を持たなくなった後にのみ、メモリ内のオブジェクトの破棄を処理します。その場合でも、GC はバックグラウンドでこれを処理する適切な時間をスケジュールし、オブジェクトへの参照数が 0 に達するとすぐにガベージ コレクションを実行するとは限りません。

.NET でのガベージ コレクションの概念の概要については、この記事を参照してください。

アンマネージ リソースを使用して作成されたオブジェクト、または CLR によって直接制御されていないリソースをアプリケーションが参照している場合、この規則には例外があります。この典型的な例は、データベース接続またはネットワーク ソケットです。このような場合Dispose、オブジェクトのリソースが確実に解放されるようにするために、実際にオブジェクトを呼び出す必要がある場合があります。

を使用する理由とタイミングについては、この質問を参照してくださいIDisposable

于 2012-08-31T13:56:41.523 に答える
1

この場合のNewは、.DataKeyNamesプロパティに存在するものをすべて新しい値に置き換えます。この場合、そのプロパティに値を追加することはありませんが、文字列配列を繰り返し作成および破棄すると、パフォーマンスが低下します。値が設定されているかどうかを確認してから、単純なif句に置き換えないことをお勧めします。

If employeeDetails.DataKeyNames Is Nothing Then
  employeeDetails.DataKeyNames = New String() {"EmployeeID"}
End If

そうは言っても、コード内の他のロジックをチェックして、このメソッドを繰り返し呼び出す理由を特定し、それらの呼び出しを減らす方法があるかどうかを確認することをお勧めします。

于 2012-08-31T13:46:49.270 に答える