イベントを模倣し、いくつかの拡張機能を提供するライブラリがあります。これは主に、登録したデリゲートを追跡することによって行われます。イベントと同様に、メモリ リークの可能性があります。
デリゲートを管理するクラスを弱参照を使用するように変更していますが、問題が発生しています。匿名のラムダを登録しGC.Collect
、デリゲートが収集された場合。登録されているデリゲートが匿名ラムダであるかどうかをプログラムで判断し、その場合は代わりに強い参照を使用したいと思います。
Q:デリゲートが匿名ラムダ (または、より一般的には、意味的にすぐに「消える」とは考えられないもの) であるかどうかを判断するにはどうすればよいですか。
プロパティがnullかどうかをチェックするのがうまくいくかもしれない方法の1つですDelegate.Target
が、これは一般的に静的メソッドをキャッチするので、それは私が望むものではないかもしれません. もう 1 つのオプションは、プロパティで true に設定されているかどうかIsSpecialName
を確認することです。それが正しいことなのかどうかもわかりません。IsStatic
Delegate.Method
懸念の 1 つは、ラムダが登録されているクラスのメンバーを使用してラムダへの強い参照がある場合、同じメモリ リークのシナリオが発生するか、破棄されたオブジェクトにアクセスする可能性があることです。これを処理する優雅な方法はありますか?