閱讀英文

共用方式為


Func<T,TResult> 代理人

定義

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

C#
public delegate TResult Func<in T,out TResult>(T arg);
C#
public delegate TResult Func<T,TResult>(T arg);

類型參數

T

這個委派所封裝之方法的參數類型。

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

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

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

參數

arg
T

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

傳回值

TResult

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

範例

下列範例示範如何宣告和使用 Func<T,TResult> 委派。 這個範例會 Func<T,TResult> 宣告變數,並指派 Lambda 運算式,將字串中的字元轉換成大寫。 封裝這個方法的委派接著會傳遞至 方法, Enumerable.Select 將字串陣列中的字串變更為大寫。

C#
// Declare a Func variable and assign a lambda expression to the
// variable. The method takes a string and converts it to uppercase.
Func<string, string> selector = str => str.ToUpper();

// Create an array of strings.
string[] words = { "orange", "apple", "Article", "elephant" };
// Query the array and select strings according to the selector method.
IEnumerable<String> aWords = words.Select(selector);

// Output the results to the console.
foreach (String word in aWords)
    Console.WriteLine(word);

/*
This code example produces the following output:

ORANGE
APPLE
ARTICLE
ELEPHANT

*/

備註

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

注意

若要參考具有一個參數並傳回 void (或 Visual Basic 中的方法,其宣告為 Sub 而非 Function) ,請改用泛型 Action<T> 委派。

當您使用委派時 Func<T,TResult> ,不需要明確定義以單一參數封裝方法的委派。 例如,下列程式碼會明確宣告名為 ConvertMethod 的委派,並將方法的 UppercaseString 參考指派給其委派實例。

C#
using System;

delegate string ConvertMethod(string inString);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference UppercaseString method
      ConvertMethod convertMeth = UppercaseString;
      string name = "Dakota";
      // Use delegate instance to call UppercaseString method
      Console.WriteLine(convertMeth(name));
   }

   private static string UppercaseString(string inputString)
   {
      return inputString.ToUpper();
   }
}

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

C#
// Instantiate delegate to reference UppercaseString method
Func<string, string> convertMethod = UppercaseString;
string name = "Dakota";
// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMethod(name));

string UppercaseString(string inputString)
{
   return inputString.ToUpper();
}

// This code example produces the following output:
//
//    DAKOTA

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

C#
 Func<string, string> convert = delegate(string s)
    { return s.ToUpper();};

 string name = "Dakota";
 Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

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

C#
Func<string, string> convert = s => s.ToUpper();

string name = "Dakota";
Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

Lambda 運算式的基礎類型是其中一個泛型 Func 委派。 這可讓您將 Lambda 運算式當做參數傳遞,而不明確地將它指派給委派。 特別是,因為命名空間中的 System.Linq 許多型別方法都有 Func<T,TResult> 參數,所以您可以傳遞這些方法 Lambda 運算式,而不需明確具現化 Func<T,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, 8, 9, 10
.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, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱