デリゲート 中編

前回はデリゲートの基礎の復習でしたが、今回は匿名メソッドとラムダ式に関して。



■匿名メソッド■
名前を持たない実装部分のみのメソッドまさに「匿名なメソッド」。
C#1.0まではデリゲートに何か処理を登録したい場合まずは「その処理を実現するメソッドを定義→デリゲート登録」
というフローでしたがC#2.0から追加された匿名メソッドを使用すればそんなものは必要なくなります。


定義方法は


delegate(引数リスト){処理}

実際に使ってみる

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace Test
{
class Program
{
delegate void DelSimple();
static void Main(string[] args)
{
// メソッド定義をせずともデリゲートに処理を追加出来ます。
DelSimple delHello = delegate() { Console.WriteLine("こんにちわ"); };
delHello();
}
}
}

結果

こんにちわ

ラムダ式

ラムダ式とはC#3.0から追加された数を整数と同じ様に扱うための手法です。

ラムダ式を使うと匿名メソッドが簡単に書けます。というよりも、
ラムダ式を使用してデリゲートへメソッドを代入した場合それは匿名メソッド扱い」になります

グダグダ御託が長いのもアレなので実際のコード。
上のコードにラムダ式verを付け加えてみます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace Test
{
class Program
{
delegate int DelReturn(int i);
static void Main(string[] args)
{
// メソッド定義をせずともデリゲートに処理を追加出来ます。
Console.WriteLine("------------------------------");
DelReturn delHello = delegate(int i) { Console.WriteLine("こんにちわ"); return i; };
Console.WriteLine(delHello(777));

// 上の匿名メソッドをラムダ式verにしてみます。
// ラムダ式 → (引数) => {処理}
Console.WriteLine("------------------------------");
delHello = (int i) => { Console.WriteLine("こんにちわ"); return i; };
delHello(0);

// 処理が一行で収まるものは{}をはずせる。returnもはずせます。
Console.WriteLine("------------------------------");
delHello = (int i) => i; //既にhelloではない・・・
Console.WriteLine(delHello(777));

// 引数が明らかな場合は型すら省略できる。
Console.WriteLine("------------------------------");
delHello = i => i;
Console.WriteLine(delHello(777));

// デリゲートを楽に定義する方法
// .NetFramework3.5よりFuncというジェネリクスが追加されたのでそれを使用してもOK。
Func delFunc = (name) => { Console.WriteLine(name); return name.Length; };
Console.WriteLine(delFunc("さようなら"));

}
}
}


結果


                                                          • -

こんにちわ
777

                                                          • -

こんにちわ

                                                          • -

777

                                                          • -

777
さようなら
5

ちなみに=>はラムダ演算子と言って、「〜に入力」と読むようです。
(by MSDNVisualC#デベロッパーセンター)