私は母語が BASIC でして、だからなのか VB のほうをよく使っていて、ゆえに C# を書こうとすると戸惑うことがあり、event も書き方をよく忘れるのでメモ(汗
以下はほぼ等価なイベントを使ったサンプルコード。結果だけ見れば、なんでこんな迂遠なことを、なんだけどもサンプルっとことで(汗
- VB.NET
Module Program Private WithEvents _obj As Class1 Sub Main(args As String()) _obj = New Class1 _obj.Method01() End Sub Private Sub _obj_Event01(message As String, value As Integer) Handles _obj.Event01 Console.WriteLine("{0} {1}", message, value) End Sub End Module Class Class1 Public Event Event01(message As String, value As Integer) Public Sub Method01() RaiseEvent Event01("Hello1", 1) End Sub End Class
- C#
class Program { private static Class1 _obj; static void Main(string[] args) { _obj = new Class1(); _obj.Event01 += _obj_Event01; _obj.Method01(); } public static void _obj_Event01(string s, int i) { Console.WriteLine("{0} {1}", s, i); } } class Class1 { public event Action<string, int> Event01; public void Method01() { this.Event01("Helo", 1); } }
個人的には VB のほうの構文が好きでして、それは以下のような理由です。
- WithEvents キーワードでイベントを起こすオブジェクトだというのが明示できる点
- Handles キーワードでイベントで呼ばれるメソッドだということが明示される点
- RaiseEvent でイベントを実行していることが明示される点
- event 用の delegate を別に定義しなくてよい点
- IDE の機能でイベントメソッドを自動作成してくれる
C# のが好きでない理由はその逆ですね。
- イベントを起こすオブジェクトとそうでないオブジェクトとの差がない
- イベントで呼ばれるメソッドとそうでないメソッドが、メソッドを見ただけではわからない
(もちろんイベントを登録しているところでは解るけど場所が離れているので・・・) - イベントの実行とメソッドの呼び出しの差がない
- event 用の delegate を別に定義する必要がある。最近は Action を使えるけど、そうすると引数名が自由にならない。
- IDE の機能でイベントは自動的に作成くれなさそう
もっとも、まだ C# を使いこなせていないからそう思うだけなのかもしれません(汗