序論
sakano様のコードを参考(丸パクリ)させていただいております
私の駄文よりもsakano様の内容の方が素晴らしいと思われます。
sakano様の素晴らしい投稿↓
https://qiita.com/sakano/items/d4ad645a20860c3a86c0
delegateについて
delegateとは、委譲するという意味の英単語である。
C#ではPythonなどと違って普通の変数に関数を代入することはできない。
ここで、delegate(関数用の変数型と思ってほしい)というものを使ってみる。
何が便利かというと、複数の関数を入れられるのである。
気になるなら調べてみてね。
(イベントと関係が深いのでGUIではよく出てくる)
実際の使い方
public static void Calc(Func<int, int, int> ca)
{
for (var x = 1; x < 5; ++x)
{
for (var y = 1; y < 5; ++y)
{
Console.Write("{0,4}", ca(x, y));
}
Console.WriteLine();
}
}
public static int Add(int x, int y) { return x + y; }
public static int Average(int x, int y) { return (x + y)/2; }
}
まぁ、こんな感じ。これ実行してみると空白多すぎて気持ち悪いですけどね、はい。
まず、public static void メソッド名(Func<引数1,引数2,戻り値>Calc型の変数名)
{
処理
Console.WriteLine("{0,4}",Calc型の変数名(引数1,引数2));
}
下の方に、
public static 変数型 delegate名(?)(型 引数,型 引数){return したいこと;}
みたいな感じ。
Func以外にActionってやつもあるみたい。
出力部分は何個出力するかによるよー。
あぁ。で、メインでの呼び出し方が
public static void Main()
{
Calc(Add);
Console.WriteLine();
Calc(Average);
}
メイン関数の中だけだけど、こんな感じ。
メソッド名(delegate名);
でいけるっぽいね。
ラムダ式でもうちょい楽に
匿名メソッドを使えば、これよりもう少し楽に記述できるっぽいけど、そんなの使うくらいならもっと簡単にラムダ式を使おうということでございます。
気になった人は調べてみてもいいかも。
この下でCalcを使うけど、ここの変更は無し。そのままでおk。
で、下にあったAddとかAverageは消しちゃう。
メインにメソッド名からのラムダ式を直で書いてあげる感じ。
Calc((x,y)=>x+y);
メソッド名((引数名,引数名)=>やらせたいこと);
って感じだね。はい、以上。
class test
{
public static void Main()
{
Calc((x,y)=>x+y);
Calc((x,y)=>(x+y)/2);
}
public static void Calc(Func<int, int, int> ca)
{
for (var x = 1; x < 5; ++x)
{
for (var y = 1; y < 5; ++y)
{
Console.Write("{0,5}", ca(x, y));
}
Console.WriteLine();
}
}
}