デリゲートに普通のメソッド、匿名メソッド、ラムダ式をそれぞれ利用する例
ここでは C# のデリゲート、匿名メソッド、ラムダ式などの復習も兼ねて、 いろいろな方法でデリゲートを定義します。
自信のないところは、復習しつつ読み進んでみてください。
MyButton クラスでデリゲートを定義
まず、次のような MyButton クラスを定義します。
namespace LambdaExp1
{
public class MyButton
{
public delegate void OnClickDelegate();
public OnClickDelegate OnClick;
public void Click()
{
if (OnClick != null)
{
OnClick();
}
}
}
}
ここでは OnClickDelegate というデリゲート型を定義して、OnClickDelegate 型の OnClick を宣言しています。
また、"ボタン" らしく、Click メソッドを定義していて、この中で OnClick を呼び出しています。
デリゲートってなんだっけ?という人は「デリゲート」を確認してください。
さて、上で定義した MyButton を利用するコードを書きます。
MyButton オブジェクト b1, b2, b3, b4 でそれぞれ異なる方法でデリゲートをセットしています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LambdaExp1
{
class Program
{
static void Main(string[] args)
{
// 普通の名有りメソッド (1) デリゲートを明示的に作成
MyButton b1 = new MyButton();
b1.OnClick += new MyButton.OnClickDelegate(Foo);
b1.Click();
// 普通の名有りメソッド (2) - C# 2.0 でのシンタックス変更
MyButton b2 = new MyButton();
b2.OnClick += Bar;
b2.Click();
// 匿名メソッド
MyButton b3 = new MyButton();
b3.OnClick += delegate()
{
Console.WriteLine("Hey!");
};
b3.Click();
// ラムダ式
MyButton b4 = new MyButton();
b4.OnClick += () => Console.WriteLine("Hello!");
b4.Click();
}
static void Foo()
{
Console.WriteLine("Konnichiwa!");
}
static void Bar()
{
Console.WriteLine("Ohayo!");
}
}
}
この実行結果は次のようになります。
Konnichiwa! Ohayo! Hey! Hello!