MENU

【C#】delegate, Action, Funcについて解説

C#プログラミングを学んでいくと、delegate、Action、Funcという概念に出会います。これらは、メソッドを変数のように扱うための強力な機能です。初めて見る人には少し難しく感じるかもしれませんが、使いこなせるようになると、コードの柔軟性と再利用性が大幅に向上します。

この記事では、delegate、Action、Funcの基本的な概念から実践的な使用例まで、初心者にも分かりやすく解説していきます。

目次

delegateとは

delegateは、メソッドを参照するための型です。簡単に言えば、メソッドを変数のように扱えるようにするものです。

基本的なdelegateの使い方を見てみましょう:

using System;

class Program
{
    // delegateの定義
    delegate int MathOperation(int x, int y);

    static int Add(int a, int b)
    {
        return a + b;
    }

    static int Multiply(int a, int b)
    {
        return a * b;
    }

    static void Main(string[] args)
    {
        // delegateのインスタンス化
        MathOperation operation = Add;
        
        // delegateの使用
        int result = operation(5, 3);
        Console.WriteLine($"5 + 3 = {result}");  // 出力: 5 + 3 = 8

        // delegateの再代入
        operation = Multiply;
        result = operation(5, 3);
        Console.WriteLine($"5 * 3 = {result}");  // 出力: 5 * 3 = 15
    }
}

この例では、MathOperationというdelegateを定義し、AddメソッドとMultiplyメソッドを交互に代入して使用しています。

Actionとは

Actionは、戻り値を持たないメソッドを表すための組み込みdelegateです。0個から16個までの入力パラメータを受け取ることができます。

Actionの使用例を見てみましょう:

using System;

class Program
{
    static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }

    static void Main(string[] args)
    {
        // Actionの使用
        Action<string> print = PrintMessage;
        print("Hello, Action!");  // 出力: Hello, Action!

        // ラムダ式を使用したActionの定義
        Action<int, int> printSum = (x, y) => Console.WriteLine($"{x} + {y} = {x + y}");
        printSum(10, 20);  // 出力: 10 + 20 = 30
    }
}

この例では、Action<string>型の変数printPrintMessageメソッドを代入しています。また、ラムダ式を使用して直接Actionを定義する例も示しています。

Funcとは

Funcは、戻り値を持つメソッドを表すための組み込みdelegateです。0個から16個までの入力パラメータを受け取り、最後の型パラメータが戻り値の型を表します。

Funcの使用例を見てみましょう:

using System;

class Program
{
    static int Square(int x)
    {
        return x * x;
    }

    static void Main(string[] args)
    {
        // Funcの使用
        Func<int, int> square = Square;
        int result = square(5);
        Console.WriteLine($"5の2乗は{result}です。");  // 出力: 5の2乗は25です。

        // ラムダ式を使用したFuncの定義
        Func<int, int, string> formatSum = (x, y) => $"{x} + {y} = {x + y}";
        string formattedResult = formatSum(15, 25);
        Console.WriteLine(formattedResult);  // 出力: 15 + 25 = 40
    }
}

この例では、Func<int, int>型の変数squareSquareメソッドを代入しています。また、ラムダ式を使用して直接Funcを定義する例も示しています。

delegate、Action、Funcの使い分け

  • delegate: カスタムの委任型が必要な場合に使用します。特定の型シグネチャを持つメソッドを表現したい場合に適しています。
  • Action: 戻り値を持たないメソッドを表現する場合に使用します。例えば、イベントハンドラやコールバック関数によく使われます。
  • Func: 戻り値を持つメソッドを表現する場合に使用します。計算や変換を行うメソッドを表現するのに適しています。

まとめ

delegate、Action、Funcは、C#におけるメソッドの柔軟な取り扱いを可能にする重要な概念です。これらを使いこなすことで、より柔軟で再利用性の高いコードを書くことができます。

  • delegateは、カスタムの委任型を定義する際に使用します。
  • Actionは、戻り値のない処理を表現するのに適しています。
  • Funcは、戻り値のある処理を表現するのに適しています。

初めは少し難しく感じるかもしれませんが、実際にコードを書いて試してみることで理解が深まります。これらの概念を活用することで、より高度なC#プログラミングが可能になります。イベント処理、非同期プログラミング、LINQなど、C#の多くの高度な機能でこれらの概念が活用されているので、しっかりと理解しておくことをおすすめします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次