Leer en inglés

Compartir a través de


Action<T1,T2,T3,T4> Delegado

Definición

Encapsula un método que tiene cuatro parámetros y no devuelve un valor.

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);

Parámetros de tipo

T1

Tipo del primer parámetro del método que este delegado encapsula.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.
T2

Tipo del segundo parámetro del método que este delegado encapsula.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.
T3

Tipo del tercer parámetro del método que este delegado encapsula.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.
T4

Tipo del cuarto parámetro del método que este delegado encapsula.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.

Parámetros

arg1
T1

Primer parámetro del método que este delegado encapsula.

arg2
T2

Segundo parámetro del método que este delegado encapsula.

arg3
T3

Tercer parámetro del método que este delegado encapsula.

arg4
T4

Cuarto parámetro del método que este delegado encapsula.

Comentarios

Puede usar el Action<T1,T2,T3,T4> delegado para pasar un método como parámetro sin declarar explícitamente un delegado personalizado. El método encapsulado debe corresponder a la firma del método definida por este delegado. Esto significa que el método encapsulado debe tener cuatro parámetros que se le pasan por valor y no debe devolver un valor. (En C#, el método debe devolver void. En F#, el método o la función deben devolver la unidad. En Visual Basic, debe definirse mediante la Subconstrucción ...End Sub . También puede ser un método que devuelve un valor que se omite). Normalmente, este método se usa para realizar una operación.

Nota

Para hacer referencia a un método que tiene cuatro parámetros y devuelve un valor, use el delegado genérico Func<T1,T2,T3,T4,TResult> en su lugar.

Cuando se usa el Action<T1,T2,T3,T4> delegado, no es necesario definir explícitamente un delegado que encapsula un método con cuatro parámetros. Por ejemplo, el código siguiente declara explícitamente un delegado denominado StringCopy y asigna una referencia al CopyStrings método a su instancia de delegado.

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];
    }
}

En el ejemplo siguiente se simplifica este código mediante la creación de instancias del Action<T1,T2,T3,T4> delegado en lugar de definir explícitamente un nuevo delegado y asignarle un método con nombre.

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];
    }
}

También puede usar el Action<T1,T2,T3,T4> delegado con métodos anónimos en C#, como se muestra en el ejemplo siguiente. (Para obtener una introducción a los métodos anónimos, consulte Métodos anónimos).

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];
    }
}

También puede asignar una expresión lambda a una Action<T1,T2,T3,T4> instancia de delegado, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, vea Expresiones lambda (C#) o Expresiones lambda (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];
    }
}

Métodos de extensión

GetMethodInfo(Delegate)

Obtiene un objeto que representa el método representado por el delegado especificado.

Se aplica a

Producto Versiones
.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

Consulte también