delegate 運算子

delegate 運算子會建立可轉換成委派型別的匿名方法。 匿名方法可以轉換成型別,例如 System.ActionSystem.Func<TResult>,作為引數的型別轉換成許多方法。

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

注意

Lambda 運算式提供更精簡且更具表達性的方式來建立匿名函式。 使用 => 運算子來建構 Lambda 運算式:

Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

如需 Lambda 運算式功能的詳細資訊 (例如,捕捉外部變數),請參閱 Lambda 運算式

當您使用 delegate 運算子時,您可以省略參數清單。 如果您這樣做,則可以將建立的匿名方法轉換成含任何參數清單的委派型別,如下列範例所示:

Action greet = delegate { Console.WriteLine("Hello!"); };
greet();

Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);

// Output:
// Hello!
// This is world!

那是 Lambda 運算式不支援的唯一匿名方法功能。 在所有其他情況下,建議您以 Lambda 運算式的方式來撰寫內嵌程式碼。 您可以使用 discard 來指定方法未使用之匿名方法的兩個或多個輸入參數:

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

為了回溯相容性,如果只有單一參數名為 _,則 _ 會被視為匿名方法內該參數的名稱。

您也可以在匿名方法的宣告中使用 static 修飾詞:

Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4));  // output: 14

靜態匿名方法無法從封入範圍擷取區域變數或執行個體狀態。

您也可以使用 delegate 關鍵字來宣告委派型別

從 C# 11 開始,編譯器可能會快取從方法群組建立的委派物件。 請考慮下列 方法:

static void StaticFunction() { }

當您將方法群組指派給委派時,編譯器會快取委派:

Action a = StaticFunction;

在 C# 11 之前,您必須使用 Lambda 運算式來重複使用單一委派物件:

Action a = () => StaticFunction();

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格匿名函式運算式一節。

另請參閱