none
イベントハンドラの関連付け RRS feed

  • 質問

  • お世話になっております。

    C#では、イベントに対応する処理は、次のようにして決めます。

    イベント名 += new イベントハンドラ名(メソッド名);
    なぜ 「+=」なのでしょうか? 意味的には「=」が正しいような気がします。
    

    かなり初歩的な質問かもしれませんが、調べてみてもわからず・・・・。教えていただけませんでしょうか?

    2006年10月25日 2:38

すべての返信

  • OTAKA さん、こんにちは。

     OTAKA さんからの引用
    イベント名 += new イベントハンドラ名(メソッド名);
    なぜ 「+=」なのでしょうか? 意味的には「=」が正しいような気がします。

    複数登録可能なので、「追加」 という意味合いの方が正しかろうと思います。
    VB ならば、AddHandler になっています。

    2006年10月25日 2:56
  •  OTAKA さんからの引用

    C#では、イベントに対応する処理は、次のようにして決めます。

    イベント名 += new イベントハンドラ名(メソッド名);
    なぜ 「+=」なのでしょうか? 意味的には「=」が正しいような気がします。
    
     
    イベントは、「複数のハンドラを登録できる」 「既存の登録状況を置換することはできない」 というのがポイントです。
     
    .NET のイベントはマルチキャストになっていて、複数のイベントハンドラを割り当てることができます。
    また、第三者によって追加されているイベントが既に存在する可能性があり、通常は登録されているイベント群を完全に置き換えるような操作はできないようになっています。演算子として = を利用する場合、それがイベントに対してイベントハンドラの「置換」が行われるのか「追加」が行われるのか、すこし判断が難しくなりませんか?(イベントは置換できないという前提で)
     
    また、現状の「追加」が = 演算子で可能であった場合、「削除」に相当する操作をどのように記述するかも難しくありませんか?
     
     
    余談というか、わかりにくくするかもしれませんが、プロパティと定義する場合を比べると

     
    // EvetHandler 型のプロパティ
    public EventHandler ClickProperty
    {
      get { ... }
      set { ....}
    }
     
    // Eventhandler 型のイベント
    public event EventHandler ClickEvent
    {
      add { ... }
      remove { ....}
    }
     

     
    と記載しますが、set { ... } を呼びだすのが = で、add { .. } を呼び出すのが += なのですね。
     
    2006年10月25日 7:19