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 表达式是编写内联代码的首选方法。 可以使用弃元指定该方法未使用的两个或更多个匿名方法输入参数:
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# 语言规范中的 匿名函数表达式部分。