匿名方法----5

67 阅读2分钟

匿名方法

如果一个方法只会在初始化委托时使用一次,以后不再使用,那么便没有必要创建独立的具名方法。

匿名方法可以避免我们使用独立的具名方法。

语法:delegate (输入参数列表) {方法主体}

注意:

  1. 如果匿名方法没有使用任何参数,则参数列表部分可写为空括号或直接省略
  2. 匿名方法不会显示的声明返回值,但是方法主体必须返回一个与委托签名匹配的返回类型。

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");
        }

匿名方法优劣势

匿名方法只是减少了代码的编写量,但是并不会提高代码的运行速度。在执行代码时,编译器仍然会定义一个方法,该方法只有一个自动指定的名称,编程者并不需要知道。

在匿名方法中不能使用跳转语句跳到匿名方法外部,反之亦然。

如果需要用匿名方法多次编写同一个功能,就不要使用匿名方法,直接编写一个具名方法更好。

匿名方法的作用域

匿名方法的参数和内部变量,其作用域仅限于匿名方法的主体之内。

匿名方法可以访问外部变量,在匿名方法中使用的外部变量称为被匿名方法捕捉。

只要匿名方法还是委托的一部分,即使脱离了作用域,其捕捉的外部变量也会一直生效,而且实时更新。