基本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { // 宣言 // 戻値の型 デリゲート名 (引数) delegate int TestDelegate(string s); // デリゲートとメソッドは引数/返値が同じにする private int TestMethod (string msg) { return msg.Length; } public Form1() { InitializeComponent(); // 生成 // 引数にはメソッドを渡す TestDelegate td1 = new TestDelegate(TestMethod); // C#2.0からはnew不要(TestDelegate td2 = TestMethod)とも書ける // 実行 System.Diagnostics.Debug.Print(td1("abc").ToString()); // 3 } } |
複数代入できる(マルチキャスト)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { delegate void TestDelegate(); private void TestMethod1 () { System.Diagnostics.Debug.Print("hello"); } private void TestMethod2 () { System.Diagnostics.Debug.Print("world"); } public Form1() { InitializeComponent(); TestDelegate td = TestMethod1; td += TestMethod2; td(); // hello world } } |
匿名関数(匿名メソッド・ラムダ式)
C#2.0から匿名メソッド、C#3.0ラムダ式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { delegate int TestDelegate(string x); public Form1() { InitializeComponent(); // 匿名メソッド TestDelegate td1 = delegate (string x) { return x.Length; }; System.Diagnostics.Debug.Print(td1("abc").ToString()); // 3 // ラムダ式 TestDelegate td2 = (x) => { return x.Length; }; System.Diagnostics.Debug.Print(td1("hello").ToString()); // 5 } } |
C#2.0でジェネリック(型パラーメータ)が導入。Action,Func(返値有)を使うとDelegateの定義も不要になる。Action,Func等を定義済みデリゲートと呼ぶ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); Func<string,int> td = delegate (string x) { return x.Length; }; System.Diagnostics.Debug.Print(td("abc").ToString()); // 3 } } |
実用性はないけど、ラムダ式と定義済みデリゲートで即時実行もできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); // ラムダ式をFunc<string>にキャストして即時実行している MessageBox.Show( ((Func<string>)(() => { return "hello1"; }))() ); // 引数をとることもできる。 MessageBox.Show( ((Func<string,string>)((string x) => { return x; }))("hello2") ); } } |