Exportar (0) Imprimir
Expandir todo
Expandir Minimizar
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Action<T1, T2> (Delegado)

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

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

public delegate void Action<in T1, in T2>(
	T1 arg1,
	T2 arg2
)

Parámetros de tipo

in 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 especificado o cualquier tipo menos derivado. Para obtener más información sobre la covarianza y la contravarianza, vea Covarianza y contravarianza en genéricos.

in T2

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

Parámetros

arg1
Tipo: T1
Primer parámetro del método que este delegado encapsula.
arg2
Tipo: T2
Segundo parámetro del método que este delegado encapsula.

Puede usar el delegado Action<T1, T2> 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 el delegado. Esto significa que el método encapsulado debe tener dos parámetros, los cuales se le pasan por valor, y no debe devolver un valor. (En C#, el método debe devolver void. En Visual Basic, lo debe definir la construcción SubEnd Sub. También puede ser un método que devuelve un valor que se omite). Normalmente, se usa un método de este tipo para realizar una operación.

NotaNota

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

Al usar el delegado Action<T1, T2>, no es necesario definir explícitamente un delegado que encapsule un método con dos parámetros. Por ejemplo, el código siguiente declara explícitamente un delegado denominado ConcatStrings. A continuación asigna una referencia a cualquiera de dos métodos a su instancia de delegado. El primer método escribe dos cadenas en la consola; el segundo escribe dos cadenas en un archivo.


using System;
using System.IO;

delegate void ConcatStrings(string string1, string string2);

public class TestDelegate
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      ConcatStrings concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = WriteToFile;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}


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


using System;
using System.IO;

public class TestAction2
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = WriteToFile;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}


También puede usar el delegado Action<T1, T2> 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, vea Métodos anónimos (Guía de programación de C#).)


using System;
using System.IO;

public class TestAnonymousMethod
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = delegate(string s1, string s2) { WriteToFile(s1, s2); };
      else
         concat = delegate(string s1, string s2) { WriteToConsole(s1, s2);} ;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}


También puede asignar una expresión lambda a una instancia de delegado Action<T1, T2>, 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;
using System.IO;

public class TestLambdaExpression
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = (s1, s2) => WriteToFile(s1, s2);
      else
         concat = (s1, s2) => WriteToConsole(s1, s2);

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}


.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

.NET para aplicaciones de Windows Phone

Compatible con: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft