匿名方法
如果一个方法只会在初始化委托时使用一次,以后不再使用,那么便没有必要创建独立的具名方法。
匿名方法可以避免我们使用独立的具名方法。
语法:delegate (输入参数列表) {方法主体}
注意:
- 如果匿名方法没有使用任何参数,则参数列表部分可写为空括号或直接省略。
- 匿名方法不会显示的声明返回值,但是方法主体必须返回一个与委托签名匹配的返回类型。
3.除了数组参数以外,匿名方法的参数列表必须在数量、类型及位置、修饰符三个方面与委托保持一致。
4.如果委托声明的参数中包含了params参数,那么匿名方法的参数列表将忽略params关键字。
//创建对象
//NumDelegate nod= NumOperation.DoubleNumber;
NumDelegate nd = delegate (int num)
{
Console.WriteLine("翻倍方法执行");
return num * 2;
};
//添加方法
nd += delegate (int num)
{
Console.WriteLine("三倍方法执行");
return num * 3;
};
param指的是参数个数不确定的情况
具名方法:
static void TeamIntroduce(string teamName, params string[] members)
{
Console.WriteLine("队伍名:"+teamName);
Console.Write("队员:");
for (int i = 0; i < members.Length; i++)
{
Console.Write(members[i]+" ");
}
}
匿名方法:
public delegate void TeamDelegate(string teamName,params string[] memberNames);
//测试
static void TeamDelegateTest()
{
//此处需要省略params关键字
TeamDelegate teamDelegate = delegate (string teamName, string[] memberName)
{
Console.WriteLine("队伍名为" + teamName);
Console.Write("队员:");
for (int i = 0; i < memberName.Length; i++)
{
Console.Write(memberName[i] + " ");
}
Console.WriteLine();
};
teamDelegate("红方小队", "1", "2", "3", "4");
}
匿名方法优劣势
匿名方法只是减少了代码的编写量,但是并不会提高代码的运行速度。在执行代码时,编译器仍然会定义一个方法,该方法只有一个自动指定的名称,编程者并不需要知道。
在匿名方法中不能使用跳转语句跳到匿名方法外部,反之亦然。
如果需要用匿名方法多次编写同一个功能,就不要使用匿名方法,直接编写一个具名方法更好。
匿名方法的作用域
匿名方法的参数和内部变量,其作用域仅限于匿名方法的主体之内。
匿名方法可以访问外部变量,在匿名方法中使用的外部变量称为被匿名方法捕捉。
只要匿名方法还是委托的一部分,即使脱离了作用域,其捕捉的外部变量也会一直生效,而且实时更新。