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

Func<T1, T2, TResult>-Delegat

 

Veröffentlicht: Oktober 2016

Kapselt eine Methode, die über zwei Parameter verfügt und einen Wert des Typs zurückgibt, der durch den TResult-Parameter angegeben wird.

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

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

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.

Rückgabewert

Type: TResult

Der Rückgabewert 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.

outTResult

Der Typ des Rückgabewerts 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. Der gekapselte Methode muss der Methodensignatur entsprechen, die von diesem Delegaten definiert ist. Dies bedeutet, dass der gekapselte Methode zwei Parameter verfügen muss, von die jeder Wert übergeben wird, und einen Wert zurückgegeben werden muss.

System_CAPS_noteHinweis

Auf eine Methode zu verweisen, die über zwei Parameter verfügt und gibt void (oder in Visual Basic deklariert wird als eine Sub sondern als eine Function), verwenden Sie die generischen Action<T1, T2> stattdessen delegieren.

Bei Verwendung der Func<T1, T2, TResult> Delegaten, Sie müssen 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 einen Verweis auf die ExtractWords Methode, um eine Delegatinstanz.

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 folgende Beispiel wird dieser Code vereinfacht, durch die Instanziierung einer Func<T1, T2, TResult> Delegaten nicht explizit einen neuen Delegaten definieren und 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 die Func<T1, T2, TResult> -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 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 auch einen Lambda-Ausdruck zuweisen einer Func<T1, T2, TResult> zu delegieren, wie im folgenden Beispiel veranschaulicht. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda Expressions (Visual Basic) 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. Dadurch können einen Lambda-Ausdruck als Parameter zu übergeben, ohne explizit einen Delegaten zugewiesen werden. Insbesondere, da viele Methoden von Typen in der System.Linq -Namespace haben Func<T1, T2, TResult> Parameter können übergeben dieser Methoden einen Lambda-Ausdruck ohne explizit zu instanziieren einer Func<T1, T2, TResult> delegieren.

Im folgenden Beispiel wird veranschaulicht, wie deklarieren und Verwenden einer Func<T1, T2, TResult> delegieren. Dieses Beispiel deklariert eine Func<T1, T2, TResult> Variable und weist sie einen Lambda-Ausdruck, der verwendet ein String Wert und einen Int32 Wert als Parameter. Der Lambda-Ausdruck gibt true Wenn die Länge des der String Parameter ist gleich dem Wert von der Int32 Parameter. 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);
   }
}

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: