Erweitern Minimieren
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original
1 von 1 fanden dies hilfreich - Dieses Thema bewerten.

Action<T>-Delegat

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

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)
public delegate void Action<in T>(
	T obj
)

Typparameter

in T

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

Dieser Typparameter ist Contravariant. Das heißt, Sie können entweder den angegebenen Typ oder einen weniger abgeleiteten Typ verwenden. Weitere Informationen zu Ko- und Kontravarianz finden Sie unter Kovarianz und Kontravarianz in Generika.

Parameter

obj
Typ: T
Der Parameter der Methode, die dieser Delegat kapselt.

Sie können den Action<T>-Delegaten verwenden, um eine Methode als Parameter zu übergeben, ohne explizit einen benutzerdefinierten Delegaten zu deklarieren. Die gekapselte Methode muss der Methodensignatur entsprechen, die von diesem Delegaten definiert wird. Das bedeutet, dass die gekapselte Methode über einen Parameter verfügen muss, der als Wert übergeben wird. Außerdem darf kein Wert zurückgegeben werden. (In C# muss die Methode void zurückgeben. In Visual Basic muss sie durch das SubEnd Sub-Konstrukt definiert werden. Es kann auch eine Methode verwendet werden, die einen Wert zurückgibt, der ignoriert wird.) Normalerweise wird eine solche Methode verwendet, um eine Operation auszuführen.

HinweisHinweis

Um auf eine Methode zu verweisen, die über einen Parameter verfügt und einen Wert zurückgibt, verwenden Sie stattdessen den generischen Func<T, TResult>-Delegaten.

Wenn Sie den Action<T>-Delegaten verwenden, müssen Sie nicht explizit einen Delegaten definieren, der eine Methode mit einem einzelnen Parameter kapselt. Im folgenden Code wird beispielsweise explizit ein Delegat mit dem Namen DisplayMessage deklariert, und der Delegatinstanz wird ein Verweis auf die WriteLine-Methode oder die ShowWindowsMessage-Methode zugewiesen.


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 und nicht, indem ein neuer Delegat explizit definiert und diesem eine benannte Methode zugewiesen wird.


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 im folgenden Beispiel veranschaulicht wird. (Eine Einführung in anonyme Methoden finden Sie unter Anonyme Methoden (C#-Programmierhandbuch).)


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 Action<T>-Delegatinstanz auch einen Lambda-Ausdruck zuweisen, wie im folgenden Beispiel veranschaulicht wird. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch).)


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


Sowohl die ForEach-Methode als auch die ForEach<T>-Methode akzeptieren einen Action<T>-Delegaten als Parameter. Die vom Delegaten gekapselte Methode ermöglicht es Ihnen, eine Aktion für jedes Element im Array oder in der Liste auszuführen. Im Beispiel wird zur Veranschaulichung die ForEach-Methode verwendet.

Im folgenden Beispiel wird veranschaulicht, wie mit dem Action<T>-Delegaten der Inhalt eines List<T>-Objekts ausgegeben werden kann. In diesem Beispiel wird die Print-Methode verwendet, um den Inhalt der Liste auf der Konsole auszugeben. Darüber hinaus demonstriert das C#-Beispiel auch die Verwendung anonymer Methoden zum Anzeigen des Inhalts in der Konsole. Beachten Sie, dass im Beispiel nicht explizit eine Action<T>-Variable 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 einziger Parameter ein Action<T>-Delegat ist. Auf ähnliche Weise wird im C#-Beispiel ein Action<T>-Delegat nicht explizit instanziiert, da die Signatur der anonymen Methode eine Entsprechung für die Signatur des Action<T>-Delegaten findet, der von der List<T>.ForEach-Methode erwartet wird.


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

Unterstützt in: 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)

Community-Beiträge

HINZUFÜGEN
Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
© 2013 Microsoft. Alle Rechte vorbehalten.