Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Delegado Action<T1, T2, T3, T4>

 

Publicado: noviembre de 2016

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

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

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

Parámetros

arg1
Type: T1

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

arg2
Type: T2

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

arg3
Type: T3

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

arg4
Type: T4

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

Parámetros de tipo

inT1

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

inT2

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

inT3

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

inT4

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

Puede usar el Action<T1, T2, T3, T4> delegado que se va a 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 que está definida por el 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 Visual Basic, debe definirse mediante el Sub... End Sub construir. También puede ser un método que devuelve un valor que se pasa por alto.) Normalmente, este tipo de método se utiliza para realizar una operación.

System_CAPS_noteNota

Para hacer referencia a un método que tiene cuatro parámetros y devuelve un valor, use la interfaz genérica Func<T1, T2, T3, T4, TResult> delegar 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 a la CopyStrings método a su instancia de delegado.

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);
      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] = String.Copy(source[ctr]);
   }
}

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

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);
      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] = String.Copy(source[ctr]);
   }
}

También puede usar el Action<T1, T2, T3, T4> delegar 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 (Guía de programación de 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);
      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] = String.Copy(source[ctr]);
   }
}

También puede asignar una expresión lambda a una Action<T1, T2, T3, T4> delegar la instancia, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, vea Expresiones lambda (Guía de programación de 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);
      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] = String.Copy(source[ctr]);
   }
}

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 3.5
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: