ガベージコレクションの仕組みやメモリリークの原因については、あまり知られていません。しかし、私はそれを心配しており、より効率的なコードを書こうと思っています。だから、Asp.Net Webアプリケーションである私が取り組んでいるプロジェクトでは、Sessionがglobal.asaxで始まり、Session変数に格納されるときにカスタムDataCriteriaのインスタンスが作成されます。このカスタムDataCriteriaは、CRUDメソッドのためにデータベースと通信するために使用しているものです。Session変数に格納されているオブジェクトを参照する変数は、GCによって収集されますか?
最初の質問は、Personクラスがあり、このPersonクラスにDataCriteriaのSession変数インスタンスに設定されているDataCriteriaフィールドがあることです。 Personのインスタンスは、Sessionが終了するまで処分されないDataCriteriaのインスタンスへの参照を保持しているので、そのPersonのインスタンスを収集できるかどうか。または、そのセッションが終了するまで、人のすべてのインスタンスは処分されません。
2番目の質問はより一般的ですが、同じ問題です。基本的に私は、DataCriteriaのSession変数インスタンスを参照するメソッドで宣言されている変数がGCによって収集できるのだろうかと疑問に思っていますか?また、セッションが終了するまで、それも残っていますか?
私はここで私に与えることができるすべてのアドバイスに感謝します。ガベージコレクションを理解し、メモリリークを回避するための良い読み方が分かっていれば、私もそのことについて聞きたいです。
ありがとう、それは素晴らしい答えです。私は実際にイベントハンドラについて尋ねるつもりでした。だから、インスタンスCがそれ自身のイベントを購読するのはどうですか?これらをDisposeメソッドで購読解除する必要があります。それとも必要ないのですか? Disposeメソッドで処理する必要がある他の参照イベントへのサブスクリプションだけですか? – jhorton
自己参照はオブジェクトを存続させません。 (同様に、他のものによって参照されていないインスタンスのセット間の参照は、それらのいずれかを生き残らせません)。これは、自分自身のイベントからの購読を解除する必要がないことを意味します。オブジェクトのDisposeメソッド内では、それ自身のイベントをクリアし、他のオブジェクトのイベントからの登録を解除する必要があるだけです。 –
したがって、PersonクラスがINotifyPropertyChangedインタフェースを実装する別のクラスを継承する場合。 Personインスタンスには、PropertyChangedイベントのハンドラがあります。それはDisposeで私が退会しなければならないハンドラですか?私はそれをはっきりと理解するために実際の例が必要だと思います。 – jhorton