1


0

私はhttp://msdn.microsoft.com/en-us/library/hy3sefw3%28VS.80%29から取得した以下のコードをVBに変換して(そして明らかにそれを自分のソリューションに適用しようとしています) .aspx [このMSDNの記事]

// The event. Note that by using the generic EventHandler event type
// we do not need to declare a separate delegate type.
公開イベントEventHandler ShapeChanged。

//The event-invoking method that derived classes can override.
protected virtual void OnShapeChanged(ShapeEventArgs e){//最後のサブスクライバが// nullチェックの直後でイベントが発生する前に購読を中止した場合に競合状態になる可能性を回避するために、//イベントの一時コピーを作成します。 EventHandlerハンドラー= ShapeChanged; if(handler!= null){handler(this、e); }}

私の変換(私のプログラムに適用可能)は以下の通りです:

EventHandlerとしてのパブリックイベントStatusChanged(Of StatusChangedArgs)

OnStatusChanged(ByVal e As StatusChangedArgs)EventHandler(Of StatusChangedArgs)としてのDimハンドラ= StatusChanged 'error here' RaiseEventハンドラ(Me、e)End Sub

しかし、私はエラーを得ています: `Public Event StatusChanged(オブジェクトとして送信者、StatusChangedArgsとしてe)はイベントであり、直接呼び出すことはできません。 「RaiseEvent」ステートメントを使用してイベントを発生させます。これを正しく変換しても、MSDNから直接コピーされるため、これは意味がありません。 。 誰かアイデアがありますか?

ありがとう…

1 Answer


6


RaiseEvent StatusChanged(Me、e)

他に何も必要ありません。 NULLチェックはVB.NETでは不要です。 これは `RaiseEvent`によって国際的に行われています。

'' '' '

コメントへの返答:

C#では、競合状態を防ぐためにデリゲートをローカル変数に保存します。 C#でnullデリゲートを呼び出すと、 `NullReferenceException`が発生します。 それを防ぐためには、nullでないことを確認してください。 あなたがそれを書くならば:

if(StatusChanged!= null){//この時点で別のスレッドが `StatusChanged`をnullに設定することがある// //次の行が失敗する StatusChanged(this、e); }

しかし、VBはこれらすべてを `RaiseEvent`で行うので、nullをチェックする必要はなく、その結果、デリゲートのローカルコピーを作成する必要はありません。