2

私がやろうとしていることは非常に単純だと思いますが、うまくいきません

クラス A のどこかに静的イベントがあります。

public static event Action OnInvalidated;

データが無効化されたときに呼び出します。タイプ B の新しいクラスをインスタンス化するときは、次のようにします。

A.OnInvalidated+= () => this.RefreshColumns();

基本的に、OnInvalidated が発生したときに登録されたすべてのインスタンスで RefreshColumns を呼び出したいと思います。

これは正常にコンパイルされますが、オブジェクトを破棄するときにラムダ関数を削除するにはどうすればよいですか? やってると思う

 A.OnInvalidated-= () => this.RefreshColumns();

動作しません、宣言できません

Action myAction = () => this.RefreshColumns();

関数メンバーとして

4

2 に答える 2

2

次のようにしてみてください。

class A : IDisposable
{
    public static event Action OnInvalidated;

    public A()
    {
        A.OnInvalidated +=  this.SomeMethod();
        A.OnInvalidated +=  this.SomeOtherMethod();
    }

        public void Dispose()
        {
        A.OnInvalidated -=  this.SomeMethod();
        A.OnInvalidated -=  this.SomeOtherMethod();
        }

    public SomeMethod()
    {

    }

    public SomeOtherMethod()
    {

    }
}

メモリ リークを回避したい場合は、IDisposable を実装し、Dispose() ですべての静的イベントのサブスクライブを解除することが重要であることに注意してください。そうしないと、イベントがオブジェクトへの参照を維持するため、静的イベントのサブスクライバーがガベージ コレクションされることはありません。

于 2012-09-04T17:05:09.913 に答える
1

まず、代わりに:

A.OnInvalidated+= () => this.RefreshColumns();

メソッドを直接割り当てるだけです(()ラムダ宣言が欠落していることに注意してください):

A.OnInvalidated += this.RefreshColumns;

次に、購読を解除するときは、次のようにします。

A.OnInvalidated -= this.RefreshColumns;

問題は、必要のないときにこの匿名ラムダを導入しているため、メソッドのサブスクライブを解除することがより困難になっていることだと思います。

于 2012-09-04T17:08:34.483 に答える