Exportieren (0) Drucken
Alle erweitern
Erweitern Minimieren

Func<T1, T2, TResult>-Delegat

Aktualisiert: November 2007

Kapselt eine Methode, die über zwei Parameter verfügt und einen Wert von dem Typ zurückgibt, der vom TResult-Parameter angegeben wird.

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

public delegate TResult Func<T1, T2, TResult>(
	T1 arg1,
	T2 arg2
)

J# unterstützt die Verwendung von generischen APIs, aber nicht die Deklaration von neuen generischen APIs.
JScript unterstützt keine generischen Typen oder Methoden.

Typparameter

T1

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

T2

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

TResult

Der Typ des Rückgabewerts der Methode, die dieser Delegat kapselt.

Parameter

arg1
Typ: T1
Der erste Parameter der Methode, die dieser Delegat kapselt.
arg2
Typ: T2
Der zweite Parameter der Methode, die dieser Delegat kapselt.

Rückgabewert

Typ: TResult
Der Rückgabewert der Methode, die dieser Delegat kapselt.

Sie können diesen Delegaten verwenden, um eine Methode darzustellen, die als Parameter übergeben werden kann, ohne explizit einen benutzerdefinierten Delegaten zu deklarieren. Die Methode muss der Methodensignatur entsprechen, die von diesem Delegaten definiert wird. Das bedeutet, dass die gekapselte Methode über zwei Parameter verfügen muss, die beide als Wert übergeben werden. Außerdem muss ein Wert zurückgegeben werden.

Bb534647.alert_note(de-de,VS.90).gifHinweis:

Um auf eine Methode zu verweisen, die über zwei Parameter verfügt und void zurückgibt (oder die in Visual Basic nicht als Function, sondern als Sub deklariert wird), verwenden Sie stattdessen den generischen Action<T1, T2>-Delegaten.

Wenn Sie den Func<T1, T2, TResult>-Delegaten verwenden, müssen Sie nicht explizit einen Delegaten definieren, der eine Methode mit zwei Parametern kapselt. Der folgende Code deklariert beispielsweise explizit einen Delegaten mit dem Namen ExtractMethod und weist der Delegatinstanz einen Verweis auf die ExtractWords-Methode zu.

using System;

delegate string[] ExtractMethod(string stringToManipulate, int maximum);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference ExtractWords method
      ExtractMethod extractMeth = ExtractWords;
      string title = "The Scarlet Letter";
      // Use delegate instance to call ExtractWords method and display result
      foreach (string word in extractMeth(title, 5))
         Console.WriteLine(word);
   }

   private static string[] ExtractWords(string phrase, int limit)
   {
      char[] delimiters = new char[] {' '};
      if (limit > 0)
         return phrase.Split(delimiters, limit);
      else
         return phrase.Split(delimiters);
   }
}


Im folgenden Beispiel wird dieser Code vereinfacht, indem ein Func<T1, T2, TResult>-Delegat instanziiert wird und nicht, indem ein neuer Delegat explizit definiert und diesem eine benannte Methode zugewiesen wird.

using System;

public class GenericFunc
{
   public static void Main()
   {
      // Instantiate delegate to reference ExtractWords method
      Func<string, int, string[]> extractMethod = ExtractWords;
      string title = "The Scarlet Letter";
      // Use delegate instance to call ExtractWords method and display result
      foreach (string word in extractMethod(title, 5))
         Console.WriteLine(word);
   }

   private static string[] ExtractWords(string phrase, int limit)
   {
      char[] delimiters = new char[] {' '};
      if (limit > 0)
         return phrase.Split(delimiters, limit);
      else
         return phrase.Split(delimiters);
   }
}


Sie können den Func<T1, T2, TResult>-Delegaten 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;

public class Anonymous
{
   public static void Main()
   {
      Func<string, int, string[]> extractMeth = delegate(string s, int i)
         { char[] delimiters = new char[] {' '}; 
           return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);
         };

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extractMeth(title, 5))
         Console.WriteLine(word);
   }
}


Sie können einem Func<T1, T2, TResult>-Delegaten auch einen Lambda-Ausdruck zuweisen, wie im folgenden Beispiel veranschaulicht wird. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda-Ausdrücke und Lambda-Ausdrücke (C#-Programmierhandbuch).)

using System;

public class LambdaExpression
{
   public static void Main()
   {
      char[] separators = new char[] {' '};
      Func<string, int, string[]> extract = (s, i) => 
           i > 0 ? s.Split(separators, i) : s.Split(separators) ;

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extract(title, 5))
         Console.WriteLine(word);
   }
}


Der zugrunde liegende Typ eines Lambda-Ausdrucks ist einer der generischen Func-Delegaten. Hierdurch können Sie einen Lambda-Ausdruck als Parameter übergeben, ohne ihn explizit einem Delegaten zuzuweisen. Da viele Methoden von Typen im System.Linq-Namespace über Func<T1, T2, TResult>-Parameter verfügen, können Sie diese Methoden als Lambda-Ausdrücke übergeben, ohne explizit einen Func<T1, T2, TResult>-Delegaten zu instanziieren.

Im folgenden Beispiel wird das Deklarieren und Verwenden eines Func<T1, T2, TResult>-Delegaten veranschaulicht. In diesem Beispiel wird eine Func<T1, T2, TResult>-Variable deklariert und dieser ein Lambda-Ausdruck zugewiesen, der einen String-Wert und einen Int32-Wert als Parameter annimmt. Der Lambda-Ausdruck gibt true zurück, wenn die Länge des String-Parameters gleich dem Wert des Int32-Parameters ist. Der Delegat, der diese Methode kapselt, wird anschließend in einer Abfrage zum Filtern von Zeichenfolgen in einem Array von Zeichenfolgen verwendet.

using System;
using System.Collections.Generic;
using System.Linq;

public class Func3Example
{
   public static void Main()
   {
      Func<String, int, bool> predicate = (str, index) => str.Length == index;

      String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
      IEnumerable<String> aWords = words.Where(predicate).Select(str => str);

      foreach (String word in aWords)
         Console.WriteLine(word);
   }
}


Windows Vista, Windows XP SP2, Windows Server 2003, Windows CE, Windows Mobile für Smartphone, Windows Mobile für Pocket PC

.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

.NET Framework

Unterstützt in: 3.5

.NET Compact Framework

Unterstützt in: 3.5

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft