2

イベントを模倣し、いくつかの拡張機能を提供するライブラリがあります。これは主に、登録したデリゲートを追跡することによって行われます。イベントと同様に、メモリ リークの可能性があります。

デリゲートを管理するクラスを弱参照を使用するように変更していますが、問題が発生しています。匿名のラムダを登録しGC.Collect、デリゲートが収集された場合。登録されているデリゲートが匿名ラムダであるかどうかをプログラムで判断し、その場合は代わりに強い参照を使用したいと思います。

Q:デリゲートが匿名ラムダ (または、より一般的には、意味的にすぐに「消える」とは考えられないもの) であるかどうかを判断するにはどうすればよいですか。

プロパティがnullかどうかをチェックするのがうまくいくかもしれない方法の1つですDelegate.Targetが、これは一般的に静的メソッドをキャッチするので、それは私が望むものではないかもしれません. もう 1 つのオプションは、プロパティで true に設定されているかどうかIsSpecialNameを確認することです。それが正しいことなのかどうかもわかりません。IsStaticDelegate.Method

懸念の 1 つは、ラムダが登録されているクラスのメンバーを使用してラムダへの強い参照がある場合、同じメモリ リークのシナリオが発生するか、破棄されたオブジェクトにアクセスする可能性があることです。これを処理する優雅な方法はありますか?

4

1 に答える 1

1

基本的に、できません。実行時の匿名ラムダメソッドです。メソッド名を確認できます:

static int Foo() { return 0; }

void Main()
{
    Func<int> foo = Foo;
    Func<int> bar = () => 0;
    Console.WriteLine(foo.Method.Name); // Foo
    Console.WriteLine(bar.Method.Name); // <Main>b__0
}

これはかなり悪いアプローチですが、唯一の方法である可能性があり、fooそれbar以外の場合は区別できません。

于 2013-06-21T14:59:27.043 に答える