パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C# FuncとActionの違いと使用例





違い

どちらも関数を変数のように扱えるという特徴がありますが、以下のような違いがあります。


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