イベントの比較

宣言

  イベント発生側 イベント処理側
C++/CLI
delegata void SampleEventHandler();

ref class Publisher
{
    event SampleEventHandler^ SampleEvent;

    void Func1()
    {
        if( SampleEvent != nullptr ) // ※1
        {
            // イベントの発生
            SampleEvent();
        }
    }
};
ref class Subscriber
{
    Publisher^ publisher;

    void Func2()
    {
        publisher = gcnew Publisher();
        publisher->SampleEvent
            += gcnew SampleEventHandler(this, &Subscriber::Callback);
    }

    void Callback() {}
};
C#
delegata void SampleEventHandler();

class Publisher
{
    event SampleEventHandler SampleEvent;

    void Func1()
    {
        if( SampleEvent != null ) // ※1
        {
            // イベントの発生
            SampleEvent();
        }
    }
}
class Subscriber
{
    Publisher publisher;

    void Func2()
    {
        publisher = new Publisher();
        publisher.SampleEvent
            += new SampleEventHandler(Callback);
    }

    void Callback() {}
}
Java

※1 C#では、イベントに登録されているメソッドが存在することを、イベント発生前にそれがnullではないことから確認します。一方C++/CLIではそのような確認は不要で、確認しようとすると「イベント メンバーの使用方法が無効です (サブスクリプション、サブスクリプションの解除、および呼び出しのみが許可されています)」としてエラーとなります。このエラーにある許可されている使用方法とは、次に示すイベント アクセサ メソッドのそれぞれに対応するものです。

  • サブスクリプション … add()
  • サブスクリプションの解除 … remove()
  • 呼び出し … raise()
既定のアクセスを追加、削除、および拡張アクセサーをオーバーライドします。 - 方法: C++/CLI でイベントを使用する | MSDN

参考

参考書