ProgrammingVB.NET 開発者

Visual Basic におけるイベントメカニズム (Events) を説明し、カスタムイベントの作成例を示してください。宣言およびサブスクリプション時に注意すべき点は何ですか?

Hintsage AIアシスタントで面接を突破

回答

Visual Basic のイベント (Events) は、オブジェクトがアプリケーションの他のコンポーネントに発生した変更を通知することを可能にします。イベントは Event キーワードを使って宣言されます。RaiseEvent メソッド (VB.NET) または Raise (VB6) を使って呼び出され、コンポーネントはそれにサブスクライブできます (Handles / WithEvents)。

VB.NET の例:

Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...何らかの作業 RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("作業が完了しました!") End Sub End Class

重要なポイント:

  • イベントは、それが宣言された同じクラス内でのみ呼び出すことができます
  • イベントに引数がある場合、その型は厳密に定義される必要があります
  • WithEvents はクラスのフィールドおよびプロパティに対してのみ使用できます
  • イベントにサブスクライブした場合には、必要に応じてサブスクリプションを解除することを忘れないでください(たとえば、メモリリークを防ぐため)

ひっかけ問題

アクセス修飾子 Private でイベントを宣言し、他のクラスからそれにサブスクライブすることはできますか?

答え: いいえ、Private 修飾子はイベントの可視性をそれが宣言されたクラスのみに制限します。他のクラスはそれを認識できないため、サブスクライブすることはできません。

テーマの微妙な点についての理解不足から生じた実際のエラーの例


物語

大規模なアプリケーションでは、イベントは Public 修飾子で作成されましたが、明示的にどこにもサブスクリプション解除していませんでした。アプリケーションが長時間動作すると、不要なオブジェクトを参照しているため、メモリリークが発生しました。


物語

VB6 から VB.NET への移行時に、開発者はイベントがすべてのモジュールで利用できると期待しましたが、デフォルトではイベントは Friend でした。その結果、ハンドラーはトリガーされず、このバグは統合テストでのみ発見されました。


物語

プログラマーはイベントのデリゲートのシグネチャで sendere の順序を逆にしてしまいました。エラーメッセージは一切表示されず (イベントハンドラーは単に呼び出されなかった)、必要なビジネスロジックが半ファイナルリリースまで見逃されました。