Auf Englisch lesen

Freigeben über


Action<T> Delegat

Definition

Kapselt eine Methode, die über einen einzelnen Parameter verfügt und keinen Wert zurückgibt.

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

Typparameter

T

Der Typ des Parameters der Methode, die dieser Delegat kapselt.

Dieser Typparameter ist kontravariant. Das bedeutet, dass Sie entweder den angegebenen Typ oder einen weniger abgeleiteten Typ verwenden können. Weitere Informationen zu Kovarianz und Kontravarianz finden Sie unter Kovarianz und Kontravarianz in Generics.

Parameter

obj
T

Der Parameter der Methode, die dieser Delegat kapselt.

Beispiele

Das folgende Beispiel veranschaulicht die Verwendung des Action<T> Delegaten zum Drucken des Inhalts eines List<T> Objekts. In diesem Beispiel wird die Print -Methode verwendet, um den Inhalt der Liste in der Konsole anzuzeigen. Darüber hinaus veranschaulicht das C#-Beispiel auch die Verwendung anonymer Methoden zum Anzeigen der Inhalte in der Konsole. Beachten Sie, dass im Beispiel eine Action<T> Variable nicht explizit deklariert wird. Stattdessen wird ein Verweis auf eine Methode übergeben, die einen einzelnen Parameter akzeptiert und keinen Wert an die List<T>.ForEach -Methode zurückgibt, deren einzelner Parameter ein Action<T> Delegate ist. In ähnlicher Weise wird im C#-Beispiel ein Action<T> Delegat nicht explizit instanziiert, da die Signatur der anonymen Methode mit der Signatur des Delegaten übereinstimmt, die Action<T> von der List<T>.ForEach -Methode erwartet wird.

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

Hinweise

Sie können den Action<T> Delegaten verwenden, um eine Methode als Parameter zu übergeben, ohne einen benutzerdefinierten Delegaten explizit zu deklarieren. Die gekapselte Methode muss der Von diesem Delegaten definierten Methodensignatur entsprechen. Dies bedeutet, dass die gekapselte Methode über einen Parameter verfügen muss, der als Wert an sie übergeben wird, und sie darf keinen Wert zurückgeben. (In C# muss die -Methode zurückgeben void. In Visual Basic muss es durch das SubKonstrukt ...End Sub definiert werden. Es kann auch eine Methode sein, die einen wert zurückgibt, der ignoriert wird.) In der Regel wird eine solche Methode verwendet, um einen Vorgang auszuführen.

Hinweis

Verwenden Sie stattdessen den generischen Func<T,TResult> Delegat, um auf eine Methode zu verweisen, die über einen Parameter verfügt und einen Wert zurückgibt.

Wenn Sie den Action<T> Delegaten verwenden, müssen Sie nicht explizit einen Delegaten definieren, der eine Methode mit einem einzelnen Parameter kapselt. Der folgende Code deklariert beispielsweise explizit einen Delegat namens DisplayMessage und weist ihrer Delegateninstanz entweder einen Verweis auf die WriteLine -Methode oder die ShowWindowsMessage -Methode zu.

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

Im folgenden Beispiel wird dieser Code vereinfacht, indem der Action<T> Delegat instanziiert wird, anstatt explizit einen neuen Delegaten zu definieren und ihm eine benannte Methode zuzuweisen.

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

Sie können den Action<T> Delegaten auch mit anonymen Methoden in C# verwenden, wie das folgende Beispiel veranschaulicht. (Eine Einführung in anonyme Methoden finden Sie unter Anonyme Methoden.)

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

Sie können einer Delegateninstanz auch einen Action<T> Lambdaausdruck zuweisen, wie das folgende Beispiel veranschaulicht. (Eine Einführung in Lambdaausdrücke finden Sie unter Lambdaausdrücke.)

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

Die ForEach Methoden und ForEach nehmen jeweils einen Action<T> Delegaten als Parameter an. Mit der vom Delegaten gekapselten Methode können Sie eine Aktion für jedes Element im Array oder in der Liste ausführen. Im Beispiel wird die ForEach -Methode verwendet, um eine Abbildung bereitzustellen.

Erweiterungsmethoden

GetMethodInfo(Delegate)

Ruft ein Objekt ab, das die Methode darstellt, die vom angegebenen Delegaten dargestellt wird.

Gilt für:

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

Weitere Informationen