Leer en inglés

Compartir a través de


Action<T> Delegado

Definición

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

C#
public delegate void Action<in T>(T obj);
C#
public delegate void Action<T>(T obj);

Parámetros de tipo

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

obj
T

Parámetro del método que este delegado encapsula.

Ejemplos

En el ejemplo siguiente se muestra el uso del Action<T> delegado para imprimir el contenido de un List<T> objeto . En este ejemplo, el Print método se usa 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 mostrar el contenido en la consola. Tenga en cuenta que el ejemplo no declara explícitamente una Action<T> variable. En su lugar, pasa una referencia a un método que toma un único parámetro y que no devuelve un valor al List<T>.ForEach método , cuyo único parámetro es un Action<T> delegado. Del mismo modo, en el ejemplo de C#, no se crea una instancia explícita de un Action<T> delegado porque la firma del método anónimo coincide con la firma del Action<T> delegado esperado por el List<T>.ForEach método .

C#
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);
});

void Print(string s)
{
    Console.WriteLine(s);
}

/* This code will produce output similar to the following:
* Bruce
* Alfred
* Tim
* Richard
* Bruce
* Alfred
* Tim
* Richard
*/

Comentarios

Puede usar el Action<T> 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 un parámetro que se le pasa por valor y no debe devolver un valor. (En C#, el método debe devolver void. En Visual Basic, debe definirse mediante ...Sub``End Sub construct: 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 un parámetro y devuelve un valor, use el delegado genérico Func<T,TResult> en su lugar.

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

C#
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 mediante la creación de instancias del Action<T> delegado en lugar de definir explícitamente un nuevo delegado y asignarle un método con nombre.

C#
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 Action<T> 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;
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 Action<T> instancia de delegado, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, consulte Expresiones lambda).

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 ForEach métodos y ForEach toman un Action<T> delegado 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 ForEach método para proporcionar una ilustración.

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
.NET Framework 2.0, 3.0, 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
.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