イベントを理解するにはデリゲートも理解してないと話が進まない。
とは言っても、デリゲートは理解に苦しむことが一つある。
何がデリゲートを難解にしているのか、それは正しく「コールバック」。
勉強のためと自身でデリゲートのコールバックを使ったコードを書いても、忘れた頃に読み返すと「何がしたかったんだろうか?」と解読に苦しんだりする。まだ私が未熟ということもあるが、可読性という側面から見て、このコールバックこそが他者に理解しづらくさせる要因では?と思ってしまう。
とりあえず基本から
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:
コメントを投稿