閱讀英文

共用方式為


Func<T,TResult> 代理人

定義

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

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

類型參數

T

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

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

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

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

參數

arg
T

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

傳回值

TResult

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

範例

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

// 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 參考指派給其委派實例。

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> 委派,而不是明確定義新的委派,並將具名方法指派給它,藉此簡化此程式碼。

// 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.)

 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#) .)

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
.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

另請參閱