delegate 運算子
delegate
運算子會建立可轉換成委派型別的匿名方法。 匿名方法可以轉換成型別,例如 System.Action 和 System.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();