delegate 運算子

delegate操作員會建立一個匿名方法,你可以將其轉換成代理型態。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

你可以將匿名方法轉換成像 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 運算式來撰寫內嵌程式碼。 你可以用 discards 來指定兩個或以上該方法未使用的匿名方法輸入參數:

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 關鍵字來宣告代理 類型

編譯器可以快取從方法群組建立的代理物件。 請考慮下列方法:

static void StaticFunction() { }

當你將方法群組指派給代理時,編譯器會快取該代理:

Action a = StaticFunction;

C# 語言規格

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

另請參閱