はじめに
前回は、
前回に比べると、
ラムダ式(Lambda expressions)
okButton.Click += (sender, e) => this.Method();
okButton.Click += delegate(object sender, EventArgs e) {
this.Method();
};
上記はokButtonオブジェクトのClickイベントハンドラを、
上記の2つコードを見比べると、
上記はイベントハンドラにラムダ式を用いた例で比較をしましたが、
サンプルコード
次のコードは、
それぞれが、
private void Plus() {
foreach(var x in this.Collection) {
x.Result = x.Value1 + x.Value2; // 足し算
Console.WriteLine(x.Result);
}
private void Subtract() {
foreach(var x in this.Collection) {
x.Result = x.Value1 - x.Value2; // 引き算
Console.WriteLine(x.Result);
}
}
private void Multiply() {
foreach(var x in this.Collection) {
x.Result = x.Value1 * x.Value2; // 掛け算
Console.WriteLine(x.Result);
}
}
private void Divide() {
foreach(var x in this.Collection) {
x.Result = x.Value1 / x.Value2; // 割り算
Console.WriteLine(x.Result);
}
}
4つのメソッドは、
これを実現する方法として、
デリゲートによる処理
以下のコードは、
なお、
private void Plus() {
this.Calculate(this.CalcAdd); // 計算を委譲するメソッド
}
// 共通計算メソッド
private void Calculate(Func<int, int, int> func) {
foreach(var x in this.Collection) {
x.Result = func(x.Value1, x.Value2); // 計算を委譲
Console.WriteLine(x.Result);
}
}
// 委譲されたメソッド
private int CalcAdd(int a, int b) {
return a + b; // 足し算
}
Plusメソッドでは、
共通計算メソッドのFunc<int, int, int>デリゲート型のfuncが、
委譲するメソッドは、
Func<>は、
private int Calc(int a, int b) {}
つまりFunc<>には、
なお、
匿名メソッドを用いた処理
次に、
public void Plus() {
this.Calculate(
delegate(int a, int b) { // 匿名メソッド
return a + b;
}
);
}
Calculateメソッドの引数に、
ここでは、
ラムダ式
次に、
public void Plus() {
this.Calculate(
(int a, int b) => {
return a + b;
}
);
}
ラムダ式では、
記述が短くなるため1行にまとめてみます。
this.Calculate(
(a, b) => { return a + b; }
);
さらに、
Calculate((a, b) => a + b);
ラムダ式に置き換えたサンプルコード
結果的に、
private void Plus() { this.Calculate((a, b) => a + b); }
private void Subtract() { this.Calculate((a, b) => a - b); }
private void Multiply() { this.Calculate((a, b) => a * b); }
private void Divide() { this.Calculate((a, b) => a / b); }
// 共通計算メソッド
private void Calculate(Func<int, int, int> func) {
foreach(var x in this.Collection) {
x.Result = func(x.Value1, x.Value2); // 計算を委譲
Console.WriteLine(x.Result);
}
}
その他
以下は、
private void Method1() {
this.Method2(() => {});
}
これはルールとして捉えずに、
式ツリー(Expression Tree)
ラムダ式を、
System.
以下は、
private void Plus() {
this.Calculate((a, b) => a + b);
}
驚くべきことに、
private void Plus() {
Expression<Func<int, int, int>> ex = (a, b) => a + b;
this.Calculate(ex.Compile());
}
では、
public void Plus() {
Expression<Func<int, int, int>> ex = (a, b) => a + b;
var bin = (BinaryExpression) ex.Body;
var v1 = (ParameterExpression) bin.Left;
var v2 = (ParameterExpression) bin.Right;
Console.WriteLine(ex);
Console.WriteLine(v1);
Console.WriteLine(v2);
this.Calculate(ex.Compile());
}
実行すると、
(a + b) a b
以上からExpression Treeを上手に使いこなすことで、
しかし、
何故なら、
次回の予定
今回は、
次回は、