準備
(なし)
デザイン
1. フォーム (Form1) にボタン (button1) を配置します。
2. フォーム (Form1) にリストボックス (listBox1) を配置します。
サンプルコード (C#)
// 名前空間の追加 // (なし) // デリゲートの宣言 delegate int Tax(int v1); // クラスの宣言 class TestClass1 { public int TaxCalc(int v1) { return (int)(v1 * 0.05); } } // コード private void button1_Click(object sender, EventArgs e) { TestClass1 tc1 = new TestClass1(); Tax tax = new Tax(tc1.TaxCalc); int result = tax(100); listBox1.Items.Add(result); }
解説
delegate 経由でメソッドを呼び出し、消費税の計算を行います。
この delegate 処理を順を追ってまとめます。
1. delegate 宣言によって、Tax という delegate を作成します。
2. button1_Click イベントで、delegate 経由でメソッドを呼び出します。まず、クラスのインスタンスを作成します。delegate を作成します。その際、引数に TestClass1 インスタンスのメソッドを渡します。これで、Tax Delegate と TestClass1 のインスタンスのメソッドが関連付けられます。
3. あとは作成した delgate に引数となる数値を渡して呼び出せば、自動的に TestClass1 のインスタンスのメソッドが呼び出され、結果が出力されます。
しかしながら、私自身 delegate の存在意義がまだわかりません。このように記述するなら、delegate を通さずにいきなり、TestClass1 のインスタンスのメソッドを呼び出せばよいと思います。なぜ、delegate を一度通すのでしょうか。
delegate は代表するものと考えられます。いきなり、処理を実行するメソッドを呼び出すよりも、一度間に代表する処理を挟むことが何らかのメリットになるはずです。ここまでの状況で理解できるのは、Tax tax = new Tax(tc1.TaxCalc); によって delegate を作成する際、引数となるインスタンスのメソッドを変更するだけで、処理を変えられることだと思います。つまり、実際に処理の実行を開始する int result = tax(100); の部分の変更は必要ありません。このあたりがメリットかなと推測しています。
それにしても、int result = tax(100); はメソッドの記述に見えますが、実際には tax はクラスに対するインスタンスのようなものです。そのインスタンス名で呼び出すのは、よくよくコードを見ると、不思議な感じです。
結果
動作確認環境
Visual Studio 2015 Professional (C# 6.0)