3

公開イベント Bar を持つクラス Foo があります。Bar へのすべてのサブスクリプションをクリアする必要があります。

C# では (クラス Foo 内で) 次のように簡単です。

public void RemoveSubscribers() { this.Bar = null; }

この質問も参照)

C++/CLI でこれを行うにはどうすればよいですか? Bar を nullptr に設定できません: コンパイラがエラーを吐き出します

Usage requires 'Foo::Bar' to be a data member

Bar の RemoveAll メソッドを見てきましたが、引数として何を指定すればよいかわかりません...

EDIT 1: わかりやすくするために、 Bar は次のように宣言されました。

public ref class Foo
{
public:
    event MyEventHandler^ Bar;
};
4

1 に答える 1

1

C++/CLI は、クラス内であっても基礎となるバッキング ストア (デリゲート) を非表示にするため、単純に に設定することはできませんnullptr。デフォルトのイベント実装に依存できないため、自分で行う必要があります。

private: EventHandler^ _myEvent;

public: event EventHandler^ MyEvent 
{
    void add(EventHandler^ handler)
    {
        _myEvent += handler;
    }

    void remove(EventHandler^ handler) 
    {
        _myEvent -= handler;
    }
}

myEventこれで、単純にデリゲートを無効にすることができます:

_myEvent = nullptr;

もちろん、これにより、呼び出し方法も変更されます (C++/CLI ショート バージョンではなく C# と同じです)。

EventHandler^ myEvent = _myEvent;
if (myEvent != nullptr)
    myEvent(this, e);
于 2013-11-04T14:21:13.360 に答える