Прочитать на английском

Поделиться через


Action<T1,T2,T3> Делегат

Определение

Инкапсулирует метод с тремя параметрами и не возвращает значение.

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

Параметры типа

T1

Тип первого параметра метода, который инкапсулирует этот делегат.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
T2

Тип второго параметра метода, который инкапсулирует этот делегат.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
T3

Тип третьего параметра метода, инкапсулируемого этим делегатом.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.

Параметры

arg1
T1

Первый параметр метода, который инкапсулирует этот делегат.

arg2
T2

Второй параметр метода, который инкапсулирует этот делегат.

arg3
T3

Третий параметр метода, который инкапсулирует этот делегат.

Комментарии

Можно использовать делегат Action<T1,T2,T3> для передачи метода в качестве параметра без явного объявления пользовательского делегата. Инкапсулированный метод должен соответствовать сигнатуре метода, определенной этим делегатом. Это означает, что инкапсулированный метод должен иметь три параметра, передаваемые в него по значению, и он не должен возвращать значение. (В C#метод должен возвращать void. В F# метод или функция должны возвращать единицу. В Visual Basic он должен быть определен Sub...End Sub конструкции. Это также может быть метод, который возвращает значение, которое игнорируется.) Как правило, такой метод используется для выполнения операции.

Примечание

Чтобы ссылаться на метод с тремя параметрами и возвращать значение, используйте вместо него универсальный делегат Func<T1,T2,T3,TResult>.

При использовании делегата Action<T1,T2,T3> не нужно явно определять делегат, который инкапсулирует метод с тремя параметрами. Например, следующий код явно объявляет делегат с именем StringCopy и назначает ссылку на метод CopyStrings экземпляру делегата.

C#
using System;

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

public class TestDelegate
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        StringCopy copyOperation = CopyStrings;
        copyOperation(ordinals, copiedOrdinals, 3);
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target, int startPos)
    {
        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 <= source.Length - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

В следующем примере этот код упрощается путем создания экземпляра делегата Action<T1,T2,T3> вместо явного определения нового делегата и назначения именованного метода.

C#
using System;

public class TestAction3
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int> copyOperation = CopyStrings;
        copyOperation(ordinals, copiedOrdinals, 3);
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target, int startPos)
    {
        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 <= source.Length - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

Вы также можете использовать делегат Action<T1,T2,T3> с анонимными методами в C#, как показано в следующем примере. (Введение в анонимные методы см. в разделе Анонимные методы.)

C#
using System;

public class TestAnon
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int> copyOperation = delegate (string[] s1,
                                                                 string[] s2,
                                                                 int pos)
                                        { CopyStrings(s1, s2, pos); };
        copyOperation(ordinals, copiedOrdinals, 3);
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target, int startPos)
    {
        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 <= source.Length - 1; ctr++)
            target[ctr] = source[ctr];
    }
}

Можно также назначить лямбда-выражение экземпляру делегата Action<T1,T2,T3>, как показано в следующем примере. (Введение в лямбда-выражения см. в лямбда-выражения (C#) или лямбда-выражения (F#).)

C#
using System;

public class TestLambda
{
    public static void Main()
    {
        string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
        string[] copiedOrdinals = new string[ordinals.Length];
        Action<string[], string[], int> copyOperation = (s1, s2, pos) =>
                                        CopyStrings(s1, s2, pos);
        copyOperation(ordinals, copiedOrdinals, 3);
        foreach (string ordinal in copiedOrdinals)
            Console.WriteLine(string.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
    }

    private static void CopyStrings(string[] source, string[] target, int startPos)
    {
        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 <= source.Length - 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, 10
.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

См. также раздел