英語で読む

次の方法で共有


Action<T1,T2,T3,T4> 代理人

定義

4 個のパラメーターを持ち、値を返さないメソッドをカプセル化します。

C#
public delegate void Action<in T1,in T2,in T3,in T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
C#
public delegate void Action<T1,T2,T3,T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

型パラメーター

T1

このデリゲートによってカプセル化されるメソッドの最初のパラメーターの型。

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。
T2

このデリゲートによってカプセル化されるメソッドの 2 番目のパラメーターの型。

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。
T3

このデリゲートによってカプセル化されるメソッドの 3 番目のパラメーターの型。

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。
T4

このデリゲートによってカプセル化されるメソッドの 4 番目のパラメーターの型。

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。

パラメーター

arg1
T1

このデリゲートによってカプセル化されるメソッドの最初のパラメーター。

arg2
T2

このデリゲートによってカプセル化されるメソッドの 2 番目のパラメーター。

arg3
T3

このデリゲートによってカプセル化されるメソッドの 3 番目のパラメーター。

arg4
T4

このデリゲートによってカプセル化されるメソッドの 4 番目のパラメーター。

注釈

デリゲートを Action<T1,T2,T3,T4> 使用すると、カスタム デリゲートを明示的に宣言せずに、メソッドをパラメーターとして渡すことができます。 カプセル化されたメソッドは、このデリゲートによって定義されるメソッド シグネチャに対応している必要があります。 つまり、カプセル化されたメソッドには、値によってすべて渡される 4 つのパラメーターが必要であり、値を返す必要はありません。 (C# では、 メソッドは を返すvoid必要があります。F# では、メソッドまたは関数は unit を返す必要があります。Visual Basic では、...End Sub コンストラクトによって定義されているSub必要があります。また、無視される値を返すメソッドを指定することもできます。通常、このようなメソッドは操作を実行するために使用されます。

注意

4 つのパラメーターを持ち、値を返すメソッドを参照するには、代わりにジェネリック Func<T1,T2,T3,T4,TResult> デリゲートを使用します。

デリゲートを Action<T1,T2,T3,T4> 使用する場合、4 つのパラメーターを持つメソッドをカプセル化するデリゲートを明示的に定義する必要はありません。 たとえば、次のコードでは、 という名前 StringCopy のデリゲートを明示的に宣言し、 メソッドへの参照を CopyStrings そのデリゲート インスタンスに割り当てます。

C#
using System;

delegate void StringCopy(string[] stringArray1,
                         string[] stringArray2,
                         int indexToStart,
                         int numberToCopy);

public class TestDelegate
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth",
                           "Sixth", "Seventh", "Eighth", "Ninth", "Tenth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        StringCopy copyOperation = CopyStrings;
        copyOperation(ordinals, copiedOrdinals, 3, 5);

        Console.WriteLine();
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target,
                                    int startPos, int number)
    {
        if (source.Length != target.Length)
            throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

        for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

次の例では、新しいデリゲートを明示的に定義して名前付きメソッドを Action<T1,T2,T3,T4> 割り当てるのではなく、デリゲートをインスタンス化することで、このコードを簡略化します。

C#
using System;

public class TestAction4
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth",
                           "Sixth", "Seventh", "Eighth", "Ninth", "Tenth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int, int> copyOperation = CopyStrings;
        copyOperation(ordinals, copiedOrdinals, 3, 5);

        Console.WriteLine();
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target,
                                    int startPos, int number)
    {
        if (source.Length != target.Length)
            throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

        for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

次の例に Action<T1,T2,T3,T4> 示すように、C# の匿名メソッドで デリゲートを使用することもできます。 (匿名メソッドの概要については、「 匿名メソッド」を参照してください)。

C#
using System;

public class TestAnonymousMethod
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth",
                           "Sixth", "Seventh", "Eighth", "Ninth", "Tenth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int, int> copyOperation =
                                             delegate (string[] s1, string[] s2,
                                             int pos, int num)
                                  { CopyStrings(s1, s2, pos, num); };
        copyOperation(ordinals, copiedOrdinals, 3, 5);

        Console.WriteLine();
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target,
                                    int startPos, int number)
    {
        if (source.Length != target.Length)
            throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

        for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

次の例に示すように、ラムダ式を Action<T1,T2,T3,T4> デリゲート インスタンスに割り当てることもできます。 (ラムダ式の概要については、「 ラムダ式 (C#)」または「ラムダ式(F#)」を参照してください)。

C#
using System;

public class TestLambdaExpression
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth",
                           "Sixth", "Seventh", "Eighth", "Ninth", "Tenth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int, int> copyOperation = (s1, s2, pos, num)
                                             => CopyStrings(s1, s2, pos, num);
        copyOperation(ordinals, copiedOrdinals, 3, 5);

        Console.WriteLine();
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target,
                                    int startPos, int number)
    {
        if (source.Length != target.Length)
            throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

        for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

拡張メソッド

GetMethodInfo(Delegate)

指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください