none
イベントプロパティの宣言と初期化とは同時には行なえないんでしょうか RRS feed

  • 質問

  • class c

    {

      delegate void oge();

      event oge hoge = delegate { /**/ };

      //っていうコードのhogeにaddとremoveを追加したいのですが。

      //よろしくお願いいたします。

     

     

    2008年5月16日 3:39

回答

  • 通常は add および remove は記述する必要がありません。
    http://msdn.microsoft.com/ja-jp/library/8627sbea.aspx

     

    以下のページの「クラスにインターフェイス イベントを実装するには」のような実装をします。
    使用例にはイベント アクセサ add および remove も記述するサンプルもあります。
    http://msdn.microsoft.com/ja-jp/library/ak9w5846.aspx

     

    イベントは EventHandler や EventArgs かその継承を使います。
    event EventHandler xxxEventHandler;
    void Onxxx(EventArgs e) のメソッドをイベント定義側で書いておくと便利です。
    void xxx(object sender, EventArgs e) の形式のメソッドが呼ばれます。

    2008年5月16日 7:22
  • add/remove を書くならデリゲートの実体は別にフィールドで持つことになるでしょうから、そっちを初期化してあげてください。

    2008年5月16日 7:40
  •  佐世保 さんからの引用

      event oge hoge = delegate { /**/ };

      //っていうコードのhogeにaddとremoveを追加したいのですが。

     

    無理です。addとremoveを書けばイベントをフィールドのように扱えなくなりますので、デリゲートを直接代入することができなくなります。

    2008年5月16日 17:23
    モデレータ
  • C# 1.2仕様書(VS2005付属)より。

     

    Code Snippet
    class X
    {
     public event D Ev;
    }

     

    この宣言をコンパイルすると、次のようになります。

    Code Snippet
    class X
    {
     private D __Ev;  // field to hold the delegate
     public event D Ev {
      add {
       lock(this) { __Ev = __Ev + value; }
      }
      remove {
       lock(this) { __Ev = __Ev - value; }
      }
     }
    }

     

    これに似た形でadd/removeを実装するのであれば、__Evに相当する変数にdelegat { }を初期値として代入するようなコードを書けば良いのでは?

    (Hongliangさんが既に案として出されているものです)

    2008年5月17日 3:09
    モデレータ

すべての返信

  • 通常は add および remove は記述する必要がありません。
    http://msdn.microsoft.com/ja-jp/library/8627sbea.aspx

     

    以下のページの「クラスにインターフェイス イベントを実装するには」のような実装をします。
    使用例にはイベント アクセサ add および remove も記述するサンプルもあります。
    http://msdn.microsoft.com/ja-jp/library/ak9w5846.aspx

     

    イベントは EventHandler や EventArgs かその継承を使います。
    event EventHandler xxxEventHandler;
    void Onxxx(EventArgs e) のメソッドをイベント定義側で書いておくと便利です。
    void xxx(object sender, EventArgs e) の形式のメソッドが呼ばれます。

    2008年5月16日 7:22
  • add/remove を書くならデリゲートの実体は別にフィールドで持つことになるでしょうから、そっちを初期化してあげてください。

    2008年5月16日 7:40
  •  佐世保 さんからの引用

      event oge hoge = delegate { /**/ };

      //っていうコードのhogeにaddとremoveを追加したいのですが。

     

    無理です。addとremoveを書けばイベントをフィールドのように扱えなくなりますので、デリゲートを直接代入することができなくなります。

    2008年5月16日 17:23
    モデレータ
  • C# 1.2仕様書(VS2005付属)より。

     

    Code Snippet
    class X
    {
     public event D Ev;
    }

     

    この宣言をコンパイルすると、次のようになります。

    Code Snippet
    class X
    {
     private D __Ev;  // field to hold the delegate
     public event D Ev {
      add {
       lock(this) { __Ev = __Ev + value; }
      }
      remove {
       lock(this) { __Ev = __Ev - value; }
      }
     }
    }

     

    これに似た形でadd/removeを実装するのであれば、__Evに相当する変数にdelegat { }を初期値として代入するようなコードを書けば良いのでは?

    (Hongliangさんが既に案として出されているものです)

    2008年5月17日 3:09
    モデレータ
  • こんにちは!中川 俊輔です。

     

    皆様、回答ありがとうございます。

     

    佐世保さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?
    勝手ながら、有用と思われる回答に回答済みチェックをつけさせていただきました。


    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。
    ロジック7さんはチェックを解除することもできますので、ご確認ください。


    それでは!

    2008年6月16日 10:04