为什么要使用匿名方法
在实例化委托时,有时候需要的匹配方法只是临时使用,这时候就没必要创建独立的具名方法,使用匿名方法将会使代码变得更简单。
匿名方法的定义及注意事项
匿名方法是实例化委托时内联声明的方法,通常的使用环境有:声明委托变量时作为初始化表达式、组合委托时在赋值表达式的右边、为委托增加事件时在赋值表达式的右边。它由delegate关键字、参数列表和语句块组成,如下:
delegate (Paramters) {ImplementionCode}
在使用匿名方法时需要注意以下事项:
返回类型
匿名方法不会显式声明返回值,而是在实体代码中通过return语句返回与委托声明相同的返回类型,如果委托的返回类型是void类型,则不返回。
参数
匿名方法的参数需要与委托的参数相匹配,包括参数数量、参数类型及位置。如果委托的参数列表没有参数且不包含out参数,则可省略匿名方法的参数列表或使用一个空括号替代。
params参数
如果委托声明的参数列表包含了params参数,那么匿名方法的参数列表将忽略params关键字。
变量和参数的作用域
一般来说,参数与变量的作用域是限制在实现代码的主体之内的,但在某些特殊情况下,匿名方法可以访问外围作用域的局部变量和环境,使用外部变量的这一过程称为被方法捕获。,也就是说,只要捕获方法是委托的一部分,即使变量已经离开了作用域,捕获的外部变量也会一直有效。如下代码示例:
delegate void MyDelegate();
static void Main()
{
MyDelegate del;
{
int x=5;
del=delegate{ Console.WriteLine($"value of x is {x}.");};
}
Console.WriteLine($"value of x is {x}");//报错
del;//成功,因为del委托中的匿名方法在它的环境中保留了x
}