Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

Action<T> (Delegado)

Encapsula un método que tiene un solo parámetro y no devuelve un valor.

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

public delegate void Action<in T>(
	T obj
)

Parámetros de tipo

in T

Tipo de 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.

Parámetros

obj
Tipo: T
Parámetro del método que este delegado encapsula.

Puede usar el delegado Action<T> 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 un parámetro, el cual se le pasa 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 un parámetro y devuelve un valor, use en su lugar el delegado genérico Func<T, TResult>.

Al usar el delegado Action<T>, no es necesario definir explícitamente un delegado que encapsule un método con un solo parámetro. Por ejemplo, el código siguiente declara explícitamente un delegado denominado DisplayMessage y asigna una referencia al método WriteLine o ShowWindowsMessage a su instancia de delegado.


using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}


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


using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}


También puede usar el delegado Action<T> 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.Windows.Forms;

public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { ShowWindowsMessage(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}


También puede asignar una expresión lambda a una instancia de delegado Action<T>, 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.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => ShowWindowsMessage(s); 
      else
         messageTarget = s => Console.WriteLine(s);

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}


Los métodos ForEach y ForEach<T> toman cada uno un delegado Action<T> como parámetro. El método encapsulado por el delegado permite realizar una acción en cada elemento de la matriz o lista. En el ejemplo se usa el método ForEach para proporcionar una demostración.

En el ejemplo siguiente, se muestra el uso del delegado Action<T> para imprimir el contenido de un objeto List<T>. En este ejemplo, el método Print se utiliza para mostrar el contenido de la lista en la consola. Además, el ejemplo de C# también muestra el uso de métodos anónimos para presentar el contenido en la consola. Observe que el ejemplo no declara una variable Action<T> explícitamente. En su lugar, pasa una referencia a un método que toma un parámetro único y eso no devuelve un valor al método List<T>.ForEach, cuyo parámetro único es un delegado Action<T>. De forma similar, en el ejemplo de C#, no se crean instancias explícitas del delegado Action<T> porque la firma del método anónimo coincide con la firma del delegado Action<T> que espera el método List<T>.ForEach .


using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String>();
        names.Add("Bruce");
        names.Add("Alfred");
        names.Add("Tim");
        names.Add("Richard");

        // Display the contents of the list using the Print method.
        names.ForEach(Print);

        // The following demonstrates the anonymous method feature of C#
        // to display the contents of the list to the console.
        names.ForEach(delegate(String name)
        {
            Console.WriteLine(name);
        });
    }

    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}
/* This code will produce output similar to the following:
 * Bruce
 * Alfred
 * Tim
 * Richard
 * Bruce
 * Alfred
 * Tim
 * Richard
 */


.NET Framework

Compatible con: 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Compatible con:

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

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

date

Historial

Motivo

Junio de 2010

Modificada la expresión lambda de Visual Basic para utilizar la palabra clave Sub.

Comentarios de los clientes.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft