none
イベントの発生を確認する方法 RRS feed

  • 質問

  • はじめての投稿です。よろしくお願いいたします。

     

    現在、VB 2008 Express を使用して、コントロールを制作中です。
    VB と C# の違いがよくわからず、どのようにコーディングしていいのかわかりません。
    下記のコードで、Value プロパティの Set 時に値が更新された場合において、ValueChanged イベントが発生していない場合、ValueChanged イベントを発生させようと思っています。
    C# の場合、「ValueChanged != null」= 「true」であれば、ValueChanged イベントが発生していないことが確認できますが、VB の場合は、どうすれば確認できるのでしょうか?


    /// C# のコード

    /// フィールド
    private int _value = 0;

    /// イベント
    public event EventHandler ValueChanged;

    /// プロパティ
    public int Value
    {
     get { return _value; }
     set
     {
      bool valChanged = (_value != value);
      _value = value;

      /// Value プロパティの値が更新された場合において、
      /// ValueChanged イベントが発生していない場合は、ValueChanged イベントを発生させる
      if ((ValueChanged != null) && (valChanged))
       ValueChanged(this, new EventArgs());
     }
    }


    ' VB のコード

    ' フィールド
    Private _value As Integer = 0

    ' イベント
    Public Event ValueChanged As EventHandler

    ' プロパティ
    Public Property Value() As Integer
     Get
      Return _value
     End Get
     Set(ByVal value As Integer)
      Dim valChanged As Boolean = False
      If Not _value = value Then valChanged = True
      _value = value

      'TODO: 「Not ValueChanged Is Nothing」では、エラーとなります。
      If Not ValueChanged Is Nothing And valChanged Then RaiseEvent ValueChanged(Me, New EventArgs())
     End Set
    End Property

    2008年3月30日 3:13

回答

  • VB では RaiseEvent する際に対象のイベントにハンドラが追加されているかどうか気にする必要はありません。

    カスタムイベントを書くと分かりますが、VB では(C# では add/remove 節に該当する)AddHandler/RemoveHandler 節のほかに RaiseEvent 節も書く必要があり、Nothing 判定するのはこの場所になります。

     

    // 個人的には C# も event をデリゲートとして扱うのではなく VB のように raise 節を書きたかった……。

    2008年3月30日 3:36
  • Hongliang さん、早速のご回答ありがとうございます。

     

    同じ、.NET Framework のイベントメカニズムを使用するのだからと考え、VB においても C# と同じようにハンドラが追加されているか判定しないといけないと思っておりました。

     

    とても参考になりました。ありがとうございました。

     

    VB.NET のイベントメカニズムをこれからしっかり理解していこうと思いますので、今後ともよろしくお願いいたします。

     

    ありがとうございました。

    2008年3月30日 4:40
  •  bell3 さんからの引用

    C# の場合、「ValueChanged != null」= 「true」であれば、ValueChanged イベントが発生していないことが確認できますが、VB の場合は、どうすれば確認できるのでしょうか?

    「イベントの発生」と言われると、そのイベントの呼び出しが行われたことと認識しました。

    今回の場合、イベントハンドラが割り当てられているかどうか、イベントハンドラが設定されているかどうかといったようなことだと思います。

     

    で、あまり関係ないことだけを書くのは難なので、Tips的に書きます。

    C#の場合、匿名デリゲートで空のイベントハンドラを最初から入れておくと、nullチェックがいらなくなります。

     

    Code Snippet

    public event EventHandler ValueChanged = delegate { };


     

    2008年3月30日 7:28
    モデレータ
  • Azulean さん ご指摘ありがとうございます。

     

    C# および VB も、日々勉強中です。

    どのように皆さんに質問させていただいたら良いのかも、わからない状態です。

    誤解を招くような表現をしてしまったことを反省しております。

     

    また、ご紹介いただきました Tip は、とても興味深く、参考になりました。感謝いたします。

     

    今後も、意味不明な投稿をしてしまうかもしれませんが、皆さんの暖かい返信を期待いたします。

     

    ありがとうございました。 

    2008年3月30日 9:19

すべての返信

  • VB では RaiseEvent する際に対象のイベントにハンドラが追加されているかどうか気にする必要はありません。

    カスタムイベントを書くと分かりますが、VB では(C# では add/remove 節に該当する)AddHandler/RemoveHandler 節のほかに RaiseEvent 節も書く必要があり、Nothing 判定するのはこの場所になります。

     

    // 個人的には C# も event をデリゲートとして扱うのではなく VB のように raise 節を書きたかった……。

    2008年3月30日 3:36
  • Hongliang さん、早速のご回答ありがとうございます。

     

    同じ、.NET Framework のイベントメカニズムを使用するのだからと考え、VB においても C# と同じようにハンドラが追加されているか判定しないといけないと思っておりました。

     

    とても参考になりました。ありがとうございました。

     

    VB.NET のイベントメカニズムをこれからしっかり理解していこうと思いますので、今後ともよろしくお願いいたします。

     

    ありがとうございました。

    2008年3月30日 4:40
  •  bell3 さんからの引用

    C# の場合、「ValueChanged != null」= 「true」であれば、ValueChanged イベントが発生していないことが確認できますが、VB の場合は、どうすれば確認できるのでしょうか?

    「イベントの発生」と言われると、そのイベントの呼び出しが行われたことと認識しました。

    今回の場合、イベントハンドラが割り当てられているかどうか、イベントハンドラが設定されているかどうかといったようなことだと思います。

     

    で、あまり関係ないことだけを書くのは難なので、Tips的に書きます。

    C#の場合、匿名デリゲートで空のイベントハンドラを最初から入れておくと、nullチェックがいらなくなります。

     

    Code Snippet

    public event EventHandler ValueChanged = delegate { };


     

    2008年3月30日 7:28
    モデレータ
  • Azulean さん ご指摘ありがとうございます。

     

    C# および VB も、日々勉強中です。

    どのように皆さんに質問させていただいたら良いのかも、わからない状態です。

    誤解を招くような表現をしてしまったことを反省しております。

     

    また、ご紹介いただきました Tip は、とても興味深く、参考になりました。感謝いたします。

     

    今後も、意味不明な投稿をしてしまうかもしれませんが、皆さんの暖かい返信を期待いたします。

     

    ありがとうございました。 

    2008年3月30日 9:19