Action<T> Delegát

Definice

Zapouzdří metodu, která má jeden parametr a nevrací hodnotu.

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

Parametry typu

T

Typ parametru metody, kterou tento delegát zapouzdřuje.

Tento parametr typu je kontravariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je méně odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.

Parametry

obj
T

Parametr metody, kterou tento delegát zapouzdřuje.

Příklady

Následující příklad ukazuje použití delegáta Action<T> k tisku obsahu objektu List<T> . V tomto příkladu Print se metoda používá k zobrazení obsahu seznamu do konzoly. Kromě toho příklad jazyka C# také ukazuje použití anonymních metod k zobrazení obsahu v konzole. Všimněte si, že v příkladu není explicitně deklarována proměnná Action<T> . Místo toho předá odkaz na metodu, která přebírá jeden parametr a která nevrací hodnotu List<T>.ForEach metodě, jejíž jediný parametr je Action<T> delegát. Podobně v příkladu jazyka C# není explicitně vytvořena instance delegáta, Action<T> protože podpis anonymní metody odpovídá podpisu Action<T> delegáta, který je očekávány metodou List<T>.ForEach .

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

Poznámky

Pomocí delegáta Action<T> můžete předat metodu jako parametr bez explicitního deklarování vlastního delegáta. Zapouzdřená metoda musí odpovídat podpisu metody, který je definován tímto delegátem. To znamená, že zapouzdřená metoda musí mít jeden parametr, který je jí předán hodnotou, a nesmí vracet hodnotu. (V jazyce C# musí metoda vrátit void. V jazyce Visual Basic musí být definován konstruktorem Sub...End Sub . Může to být také metoda, která vrací hodnotu, která je ignorována.) Taková metoda se obvykle používá k provedení operace.

Poznámka

Chcete-li odkazovat na metodu, která má jeden parametr a vrací hodnotu, použijte místo toho obecného Func<T,TResult> delegáta.

Při použití delegáta Action<T> nemusíte explicitně definovat delegáta, který zapouzdřuje metodu s jedním parametrem. Například následující kód explicitně deklaruje delegáta s názvem DisplayMessage a přiřadí odkaz na metodu WriteLine nebo metodu ShowWindowsMessage její instanci delegáta.

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

Následující příklad zjednodušuje tento kód vytvořením instance delegáta Action<T> místo explicitní definice nového delegáta a přiřazení pojmenované metody.

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

Můžete také použít delegáta Action<T> s anonymními metodami v jazyce C#, jak ukazuje následující příklad. (Úvod k anonymním metodám najdete v tématu Anonymní metody.)

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

Můžete také přiřadit výraz lambda instanci delegáta Action<T> , jak je znázorněno v následujícím příkladu. (Úvod k výrazům lambda najdete v tématu Výrazy lambda.)

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

Metody ForEach a ForEach přebírají delegáta Action<T> jako parametr. Metoda zapouzdřená delegátem umožňuje provést akci pro každý prvek v poli nebo seznamu. Příklad používá metodu ForEach k poskytnutí obrázku.

Metody rozšíření

GetMethodInfo(Delegate)

Získá objekt, který představuje metodu reprezentovanou zadaným delegátem.

Platí pro

Produkt Verze
.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, 8, 9
.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, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Viz také