違い
どちらも関数を変数のように扱えるという特徴がありますが、以下のような違いがあります。
Action
- 返り値がない場合に使用。
- 関数でいうところのvoid型に相当。
Func
- 返り値がある場合に使用。
Actionの使い方
引数がない場合
Action 変数名;
というように宣言して使用する。
using System; public class ActionTest { static void Function1() { Console.WriteLine("引数無し"); } public static void Main() { Action action = Function1; action(); } }
実行結果
引数無し
引数がある場合
Action<1つ目の引数の型, 2つ目の引数の型, … > 変数名;
というように宣言して使用する。
using System; public class ActionTest2 { static void Function2(int a, int b) { Console.WriteLine($"{a} + {b} = {a + b}"); } public static void Main() { Action<int, int> action = Function2; action(2, 4); } }
実行結果
2 + 4 = 6
Funcの使い方
引数がない場合
Func<返り値の型> 変数名;
というように宣言して使用する。
using System; public class FuncSample1 { static int Return2() { return 2; } public static void Main() { Func<int> func = Return2; Console.WriteLine(func()); } }
実行結果
2
引数がある場合
Actionのときと少し似ており、
Func<1つ目の引数の型, 2つ目の引数の型, … , 返り値の型> 変数名;
というように宣言して使用します。
返り値の型が最後になる点に注意しましょう。
using System; public class FuncSample2 { static int Function3(int a, string s) { Console.WriteLine(s); return 2; } public static void Main() { Func<int, string, int> func = Function3; int a = func(2, "2が返り値"); Console.WriteLine($"a={a}"); } }
実行結果
2が返り値 a=2
発展(ラムダ式を使用する)
これまでの例ではActionやFuncに処理を保存する場合は関数を指定したが、ラムダ式を使用することで簡潔に記述することができる。
using System; public class LambdaActionFunc { public static void Main() { Action action = () => { Console.WriteLine("ラムダ式を用いたAction"); }; Func<int, int> func = (int a) => { return a * a; }; action(); Console.WriteLine(func(2)); } }
実行結果
ラムダ式を用いたAction
4