イベントを理解するにはデリゲートも理解してないと話が進まない。
とは言っても、デリゲートは理解に苦しむことが一つある。
何がデリゲートを難解にしているのか、それは正しく「コールバック」。
勉強のためと自身でデリゲートのコールバックを使ったコードを書いても、忘れた頃に読み返すと「何がしたかったんだろうか?」と解読に苦しんだりする。まだ私が未熟ということもあるが、可読性という側面から見て、このコールバックこそが他者に理解しづらくさせる要因では?と思ってしまう。
とりあえず基本から
delegate int del1(int x); static void Main(string[] args) { del1 lambda = x => x * x; del1 deldel = delegate(int x) { return x * x; }; del1 delMethod = Method1; Console.WriteLine(lambda(5)); Console.WriteLine(deldel(5)); Console.WriteLine(delMethod(5)); } static int Method1(int n) { return n * n; }3種類あるが書き方が違うだけでどれも同じ処理。
これだけなら恐らく、プログラム始めて3ヶ月程度の方でも理解できるのでは?というぐらいに分かりやすい。
これにコールバックを組み合わせる。
要するにメソッドを引数にするデリゲートメソッドを作るということ。
delegate int del1(int x); delegate int delCallback1(int x, del1 callback); static void Main(string[] args) { del1 lambda = x => x * x; del1 deldel = delegate(int x) { return x * x; }; del1 delMethod = Method1; delCallback1 dc = Method2; Console.WriteLine(dc(5, lambda)); Console.WriteLine(dc(5, deldel)); Console.WriteLine(dc(5, delMethod)); } static int Method1(int n) { return n * n; } static int Method2(int i, del1 callback) { return callback(i); }
Method2のメソッドが引数として受け取ったメソッド(関数)を利用して値を返している。
ただこれだけでは芸がないのでもうひと工夫入れてみる。
まずはコードから
delegate int del2(int x, int y); delegate int delCallback2(del2 callback); static void Main(string[] args) { delCallback2 dc2 = Method3; Console.WriteLine(dc2((x, y) => x + y)); Console.WriteLine(dc2((x, y) => x - y)); Console.WriteLine(dc2((x, y) => x * y)); Console.WriteLine(dc2((x, y) => x / y)); } static int Method3(del2 callback) { return callback(Method4(),Method5()); } static int Method4() { return 5; } static int Method5() { return 5; }処理方法は処理元から、値はMethod4とMethod5の作り次第で変わるというもの。
書いた本人、次読み返した時にすぐに理解できるかな…
0 Comments:
コメントを投稿