3

.Net 2.0 で作業し、コード ベースをすぐに 4.0 に移行

最近、私はイベントを使用してクラスをシリアル化する作業を行っており、イベント サブスクライバー (つまり、フォーム) もシリアル化しようとします ([field:NonSerializable] を使用してこれを停止しています)。

これにより、静的クラスのメソッドにデリゲートを渡すと (メソッド スコープのみを使用する)、静的クラスがデリゲートの所有者をルート化して、GC によって収集できなくなるのではないかと考えるようになりました。

私は定期的にデリゲートを渡す静的キャッシュだけでなく、ラムダ式の仕事をしている静的な ListUtilities クラスを持っています。

4

2 に答える 2

5

いいえ、心配する必要はありません。デリゲートをメソッドに渡すことは問題ありません (そのメソッドがデリゲートをどこかに無期限に格納しない限り)。

問題は静的イベント (またはシングルトンなどの長期オブジェクトのイベント) です。これらのサブスクライブを解除しないと、イベントによってオブジェクトが永久に存続する可能性があります。例えば:

// this object is meant to be short-lived
var obj = new SomeType();

// some static event
MyUtility.SomeEvent += { obj.Foo(); };

現在、静的イベント onは、そのイベントサブスクリプションが削除されるまでMyUtility、新しいSomeTypeインスタンスが収集されないようにします...これは匿名メソッドであるため (サブスクライブを解除するにはブードゥーが必要です)、おそらく決してそうではありません。

于 2012-08-15T06:46:58.687 に答える
3

これにより、メモリ リークが発生することはありません。デリゲート参照を静的変数に保存しない限り、メソッドの終了後にデリゲート所有者を収集できます。

于 2012-08-15T06:46:22.653 に答える