2009-05-08 9 views
15

私はVB.NET(私の職場で使用されている言語)と同じようにC#に精通しています。学習プロセスの最善のことの1つは、他の言語について学ぶことで、あなたの主な言語についてもっと学ぶ傾向があることです。このポップアップのような質問はほとんどありません。VB.NET WithEventsキーワードの動作 - VB.NETコンパイラの制限?

私が見つけた過去と過去経験、WithEventsとして宣言されているVB.NETのフィールドは、イベントを発生させることができます。私はC#には直接の同等のものがないことを理解していますが、私の質問は次のとおりです:なし VB.NETでこのキーワードはイベントを発生させることができません、Cで同じ動作を作成する方法はありますか? VBコンパイラは、これらのオブジェクトのイベントを処理することを単にブロックします(実際にはいつものようにイベントを発生させることはできます)。

私はただ好奇心が強いです。私は質問のための特定のアプリケーションを持っていません...

+1

+1私は正確な逆転を試みています。つまり、私はC#からVBNETを学んでいます。あなたの良い質問ありがとう –

+2

@ウィル:楽しんで、VB.NETは、その名前で 'VB'のための悪いラップを取得しますが、主に根拠がありません - VB.NETは、VBとは全く異なる言語です。 'Option Strict On'と' Option Explicit On'を常に設定しなければならないことを覚えておいてください。これらの2行は、いくつかのデフォルトコンパイラオプションで統治されます。あなたの経験が私のようなものなら、両方の言語についてもっと学びます。 – STW

+0

ええと私はウィルと同じですが、このWithEventsが何かを理解するのは私の助けでした:)もう一度ありがとう! – Illuminati

答えて

20

省略WithEventsはイベントを発生からメンバーをブロックしません。イベントで 'handles'キーワードを使用しないようにするだけです。ここ

はWITHEVENTSの典型的な使用である:ここ

Class C1 
    Public WithEvents ev As New EventThrower() 
    Public Sub catcher() Handles ev.event 
     Debug.print("Event") 
    End Sub 
End Class 

はWITHEVENTSを使用していないクラスであり、ほぼ同等です。これは、WithEventsが非常に有用な理由を示しています。

Class C2 
    Private _ev As EventThrower 
    Public Property ev() As EventThrower 

     Get 
      Return _ev 
     End Get 

     Set(ByVal value As EventThrower) 
      If _ev IsNot Nothing Then 
        removehandler _ev.event, addressof catcher 
      End If 
      _ev = value 
      If _ev IsNot Nothing Then 
        addhandler _ev.event, addressof catcher 
      End If 
     End Set 
    End Property 

    Public Sub New() 
     ev = New EventThrower() 
    End Sub 

    Public Sub catcher() 
     Debug.print("Event") 
    End Sub 
End Class 
+0

私はそれに気付かなかったと思います。おそらく私が注意を払うのは、エラーが出たときです:-) – STW