Ler em inglês

Compartilhar via


Action<T> Delegar

Definição

Encapsula um método que tem um único parâmetro e não retorna um valor.

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

Parâmetros de tipo

T

O tipo do parâmetro do método encapsulado por esse delegado.

Este parâmetro de tipo é contravariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo menos derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.

Parâmetros

obj
T

O parâmetro do método encapsulado por esse delegado.

Exemplos

O exemplo a seguir demonstra o uso do Action<T> delegado para imprimir o conteúdo de um List<T> objeto. Neste exemplo, o Print método é usado para exibir o conteúdo da lista no console. Além disso, o exemplo de C# também demonstra o uso de métodos anônimos para exibir o conteúdo no console. Observe que o exemplo não declara explicitamente uma Action<T> variável. Em vez disso, ele passa uma referência a um método que usa um único parâmetro e que não retorna um valor para o List<T>.ForEach método, cujo único parâmetro é um Action<T> delegado. Da mesma forma, no exemplo de C#, um Action<T> delegado não é explicitamente instanciado porque a assinatura do método anônimo corresponde à assinatura do Action<T> delegado que é esperada pelo List<T>.ForEach método.

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

Comentários

Você pode usar o Action<T> delegado para passar um método como um parâmetro sem declarar explicitamente um delegado personalizado. O método encapsulado deve corresponder à assinatura do método definida por esse delegado. Isso significa que o método encapsulado deve ter um parâmetro que é passado para ele por valor e não deve retornar um valor. (Em C#, o método deve retornar void. Em Visual Basic, ele deve ser definido peloSub...End Sub Construir. Também pode ser um método que retorna um valor ignorado.) Normalmente, esse método é usado para executar uma operação.

Observação

Para fazer referência a um método que tem um parâmetro e retorna um valor, use o delegado genérico Func<T,TResult> .

Ao usar o Action<T> delegado, você não precisa definir explicitamente um delegado que encapsula um método com um único parâmetro. Por exemplo, o código a seguir declara explicitamente um delegado nomeado DisplayMessage e atribui uma referência ao WriteLine método ou ao ShowWindowsMessage método à instância delegada.

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

O exemplo a seguir simplifica esse código instanciando o Action<T> delegado em vez de definir explicitamente um novo delegado e atribuir um método nomeado a ele.

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

Você também pode usar o Action<T> delegado com métodos anônimos em C#, como ilustra o exemplo a seguir. (Para obter uma introdução aos métodos anônimos, consulte Métodos Anônimos.)

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

Você também pode atribuir uma expressão lambda a uma Action<T> instância delegada, como ilustra o exemplo a seguir. (Para obter uma introdução às expressões lambda, consulte Lambda Expressions.)

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

Os ForEach métodos e ForEach cada um assumem um Action<T> delegado como um parâmetro. O método encapsulado pelo delegado permite que você execute uma ação em cada elemento na matriz ou lista. O exemplo usa o ForEach método para fornecer uma ilustração.

Métodos de Extensão

GetMethodInfo(Delegate)

Obtém um objeto que representa o método representado pelo delegado especificado.

Aplica-se a

Produto Versões
.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

Confira também