Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Action<T1, T2, T3>-Delegat

 

Veröffentlicht: Oktober 2016

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

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

public delegate void Action<in T1, in T2, in T3>(
	T1 arg1,
	T2 arg2,
	T3 arg3
)

Parameter

arg1
Type: T1

Der erste Parameter der Methode, die dieser Delegat kapselt.

arg2
Type: T2

Der zweite Parameter der Methode, die dieser Delegat kapselt.

arg3
Type: T3

Der dritte Parameter der Methode, die dieser Delegat kapselt.

Typparameter

inT1

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

inT2

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

inT3

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

Sie können die Action<T1, T2, T3> Delegat, der eine Methode als Parameter zu übergeben, ohne explizit einen benutzerdefinierten Delegaten zu deklarieren. Der gekapselte Methode muss der Methodensignatur entsprechen, die von diesem Delegaten definiert ist. Dies bedeutet, dass der gekapselte Methode muss drei Parameter, die Wert übergeben werden, und sie müssen keinen Wert zurück. (In c# muss die Methode zurückgeben void. In Visual Basic, sie müssen definiert werden, durch die Sub...End Sub erstellen. Sie können auch eine Methode, die einen Wert zurückgibt, der ignoriert wird sein.) In der Regel wird eine solche Methode verwendet, einen Vorgang auszuführen.

System_CAPS_noteHinweis

Um eine Methode zu verweisen, die über drei Parameter verfügt und einen Wert zurückgibt, verwenden Sie die generischen Func<T1, T2, T3, TResult> stattdessen delegieren.

Bei Verwendung der Action<T1, T2, T3> Delegaten, Sie müssen nicht explizit einen Delegaten definieren, der eine Methode mit drei Parametern kapselt. Der folgende Code deklariert beispielsweise explizit einen Delegaten mit dem Namen StringCopy und weist einen Verweis auf die CopyStrings Methode, um eine Delegatinstanz.

using System;

delegate void StringCopy(string[] stringArray1, 
                         string[] stringArray2, 
                         int indexToStart);

public class TestDelegate
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];           
      StringCopy copyOperation = CopyStrings;
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length) 
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }

}

Im folgende Beispiel wird dieser Code vereinfacht, durch die Instanziierung der Action<T1, T2, T3> Delegaten nicht explizit einen neuen Delegaten definieren und eine benannte Methode zugewiesen wird.

using System;

public class TestAction3
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];           
      Action<string[], string[], int> copyOperation = CopyStrings;
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length) 
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}

Sie können auch die Action<T1, T2, T3> -Delegaten mit anonymen Methoden in c#, wie im folgenden Beispiel veranschaulicht. (Eine Einführung in anonyme Methoden finden Sie unter Anonyme Methoden (C#-Programmierhandbuch).)

using System;

public class TestAnon
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];           
      Action<string[], string[], int> copyOperation = delegate(string[] s1, 
                                                               string[] s2, 
                                                               int pos) 
                                      { CopyStrings(s1, s2, pos); };
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length) 
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}

Sie können auch einen Lambda-Ausdruck zuweisen einer Action<T1, T2, T3> -Delegatinstanz, wie im folgenden Beispiel veranschaulicht. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch).)

using System;

public class TestLambda
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];           
      Action<string[], string[], int> copyOperation = (s1, s2, pos) =>
                                      CopyStrings(s1, s2, pos); 
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(ordinal == string.Empty ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length) 
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 3.5
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: