zoukankan      html  css  js  c++  java
  • 匿名方法

    一、匿名方法的引入

    先写几个委托,后面的代码中会调用。

    1 public delegate void DelegateM1();
    2 
    3     public delegate int DelegateM2(int n1,int n2);
    4 
    5     public delegate int DelegateM3(int n);
    View Code

    我们每次在把方法赋值给委托变量的时候,需要编写一个方法,传给委托变量,代码如下:

    直接写方法:

     1 DelegateM1 m1 = M1;
     2             //反编译后等价于 DelegateM1 m1 = new DelegateM1(M1);就是说委托变量只能接受委托对象,我们把方法赋值给委托,其实内部是把方法作为委托的参数传了进去
     3 
     4             m1();//调用委托的时候,写成方法的形式,实际上是调用委托的 m1.Invoke();方法
     5 
     6 
     7 
     8 
     9 static void M1()
    10         {
    11             Console.WriteLine("这是方法M1");
    12         }
    View Code

    如果这个方法只是临时用一下,我们再单独把这个方法写下来,似乎没必要,这时候,我们在赋值的时候,直接声明一个匿名方法(无参无返回值):

    1 DelegateM1 m1 = delegate () { Console.WriteLine("这是匿名方法"); };//匿名方法的关键字:delegate
    2 
    3             m1();
    View Code

    从上面的代码,我们看出匿名方法的语法格式(关键字前面不能带类型,比如int等):

    1 delegate (参数列表) { 方法体 }
    View Code

    有一个参数的和返回值的匿名方法:

    1 DelegateM3 m3 = delegate (int n) { return n; };
    2             Console.WriteLine(m3(3));
    View Code

    有两个参数和返回值的:

    1 DelegateM2 m2 = delegate (int n1, int n2) { return n1 + n2; };
    2             Console.WriteLine(m2(2,5));
    View Code

     用匿名方法虽然使用方便,但是使用起来,让人感觉怪怪的,接下来进一步简化,这就引出了lambda表达式。(可以先把关键字,参数的类型都省略掉。如果方法体只有一句return语句,只要写上return后面的代码即可)

    无参无返回值:

    1 DelegateM1 m1 = () => { Console.WriteLine("这是lambda表达式的M1方法"); };
    2             m1();
    View Code

    有一个参数有返回值:(可以省略参数类型)

    1 DelegateM3 m2 = (int n) => { return n; };
    2             int m= m2(1);
    3             Console.WriteLine(m);
    View Code

    这种情况还有进一步简化:

    1 DelegateM3 m2 =  n => n;
    2             int m = m2(1);
    3             Console.WriteLine(m);
    View Code

    有两个参数有返回值:(可以省略参数的类型,只要参数名称)

    1  DelegateM2 m2 = (int n1, int n2) => { return n1 + n2; };
    2             Console.WriteLine(m2(1, 2));
    View Code

    也可以进一步简化:

    1 DelegateM2 m2 = (n1,n2) => n1 + n2;
    2             Console.WriteLine(m2(1, 2));
    View Code
  • 相关阅读:
    区间覆盖(线段树)
    差分约束
    二维数组
    P1195 口袋的天空
    dp的刷表法和填表法
    P1284 三角形牧场
    数据库课程设计
    具体解释VB中连接access数据库的几种方法
    android之PackageManager简单介绍
    Oracle fga审计有这几个特性
  • 原文地址:https://www.cnblogs.com/wesley168/p/6774378.html
Copyright © 2011-2022 走看看