閱讀英文

共用方式為


Func<T1,T2,TResult> 代理人

定義

封裝具有 2 個參數並傳回 TResult 參數所指定之類型值的方法。

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

類型參數

T1

此委派封裝之方法的第一個參數類型。

這是反變數的型別參數。 也就是說,您可以使用您指定的類型,或衍生程度較低的任何類型。 如需共變數與反變數的詳細資訊,請參閱泛型中的共變數與反變數
T2

此委派封裝之方法的第二個參數類型。

這是反變數的型別參數。 也就是說,您可以使用您指定的類型,或衍生程度較低的任何類型。 如需共變數與反變數的詳細資訊,請參閱泛型中的共變數與反變數
TResult

這個委派所封裝之方法的傳回值之類型。

這是共變數的型別參數。 也就是說,您可以使用您指定的類型,或衍生程度較高的任何類型。 如需共變數與反變數的詳細資訊,請參閱泛型中的共變數與反變數

參數

arg1
T1

由這個委派所封裝之方法的第一個參數。

arg2
T2

此委派封裝之方法的第二個參數。

傳回值

TResult

這個委派所封裝之方法的傳回值。

範例

下列範例示範如何宣告和使用 Func<T1,T2,TResult> 委派。 此範例會 Func<T1,T2,TResult> 宣告變數,並為其指派 Lambda 運算式,以接受 String 值和 Int32 值作為參數。 如果參數的 String 長度等於 參數的值 Int32 ,則 Lambda 運算式會 true 傳回 。 封裝這個方法的委派隨後會在查詢中使用,以篩選字串陣列中的字串。

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

備註

您可以使用此委派來表示可以當做參數傳遞的方法,而不需明確宣告自訂委派。 封裝的方法必須對應至這個委派所定義的方法簽章。 這表示封裝的方法必須有兩個參數,每個參數都會以傳值方式傳遞給它,而且必須傳回值。

注意

若要參考具有兩個參數的方法,並在 F#) (或 Visual Basic 中傳回 void (unit ,該方法宣告為 Sub 而非 Function) ,請改用泛型 Action<T1,T2> 委派。

當您使用委派時 Func<T1,T2,TResult> ,不需要明確定義封裝具有兩個參數之方法的委派。 例如,下列程式碼會明確宣告名為 ExtractMethod 的委派,並將方法的 ExtractWords 參考指派給其委派實例。

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

下列範例會具現化 Func<T1,T2,TResult> 委派,而不是明確定義新的委派,並將具名方法指派給它,藉此簡化此程式碼。

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

您可以在 C# 中搭配匿名方法使用 Func<T1,T2,TResult> 委派,如下列範例所示。 (如需匿名方法的簡介,請參閱 Anonymous Methods.)

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

您也可以將 Lambda 運算式指派給 Func<T1,T2,TResult> 委派,如下列範例所示。 (如需 Lambda 運算式的簡介,請參閱Lambda 運算式 (VB) Lambda 運算式 (C#) Lambda 運算式 (F#) .)

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

Lambda 運算式的基礎類型是其中一個泛型 Func 委派。 這可讓您將 Lambda 運算式當做參數傳遞,而不需要明確地將它指派給委派。 特別是,因為命名空間中的 System.Linq 許多型別方法都有 Func<T1,T2,TResult> 參數,所以您可以傳遞這些方法 Lambda 運算式,而不需要明確具現化 Func<T1,T2,TResult> 委派。

擴充方法

GetMethodInfo(Delegate)

取得表示特定委派所代表之方法的物件。

適用於

產品 版本
.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
.NET Framework 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
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱