匿名方法、Lambda表达式和事件
来源:互联网 发布:sql注入用户名密码 编辑:程序博客网 时间:2024/06/18 11:17
匿名方法
在前面我们知道委托可以指向一个或多个方法,当有一个方法只需要用一次并且很简短,例如:
static int Test1(int arg1,int arg2) { return arg1 + arg2; }//使用委托指向这个方法static void Main(string[] args) { Func<int, int, int> f = Test1; //常用的使用委托的方法 }
我们可以对代码进行简化,让其看起来更为简洁,所以我们可以使用匿名方法,直接忽略方法名,因为我们需要用委托指向这个方法,所以这个方法是什么名字对于委托来说不重要。我们在创建委托变量的时候就可以直接创建匿名方法,并且不需要返回值:
static void Main(string[] args) { //使用匿名方法 本质上是一个没有名字的方法,只要能使用委托变量的地方就能使用匿名方法 Func<int, int, int> f = delegate(int arg1, int arg2) { return arg1 + arg2; }; }
这样我们就不需要再额外定义一个方法,直接使用委托变量指向这个方法,因为编译器会根据return后面的值来判断返回值,所以我们也不需要写返回值。
需要注意的是,我们需要使用delegate关键字定义这个方法。
Lambda表达式
Lambda表达式其实也是匿名方式,只是换了一种表现形式。在匿名方式的例子里我们可以看得出,匿名方式将原来的代码简化成4行,但是其实我们可以使用Lambda表达式将代码再次简化。
Func<int, int, int> f = (arg1, arg2) => { return arg1 + arg2; };
这样我们直接将代码简化成一行,因为在Func委托里,已经写了参数的类型,所以我们后面不需要再重新定义数据的类型。在Lambda表达式中,我们只需要写参数以及方法体就可以了。
当参数只有一个的时候,大括号和return都可以省去
Func<int, int> a = b => b + 1;
这个语句的意思是创建了一个名字为a的委托变量,指向了一个只有b参数的方法,方法体为返回一个b+1的值。
关于Lambda表达式外部的变量
我们通过Lambda表达式也可以访问方法外部的变量,但是这个功能使用的时候需要谨慎,因为如果访问了外部的变量,那么这个表达式就不仅仅受传入的参数的控制了,结果可能还会因外部的变量的改变而改变。
例如:
//访问外部变量 int val = 15; Func<int, int> c = plus => plus + val; Console.WriteLine(c(10)); val = 20; Console.WriteLine(c(10));
这段代码中,输出的结果是不一样的,因为Lambda表达式中访问了外部val这个变量,当val的值改变,这个表达式所返回的值也随之改变。
事件
我们可以认为事件是一种具有特殊签名的委托,它基于委托,为委托提供了一个发布/订阅机制。
事件的声明
public event 委托类型 事件名;public delegate void MyDelegate();
事件使用event关键字来声明,它的返回类型是一个委托类型,通常来说,事件的命名是以名字+Event作为它的名称,在写代码过程中,我们需要尽量使用规范命名,增加代码可读性。
在下一篇文章中会写一个例子,来弄清楚委托和事件的区别。
- 匿名方法、Lambda表达式和事件
- 匿名方法和Lambda表达式
- 匿名方法和Lambda表达式
- 匿名方法和lambda表达式
- 匿名方法、Lambda表达式
- 匿名方法 Lambda表达式
- C# 匿名方法和Lambda表达式
- 委托和匿名方法、lambda表达式
- C#匿名方法和Lambda表达式
- 委托中的匿名方法和lambda表达式
- C# 匿名方法和Lambda表达式
- 匿名方法与lambda表达式
- 匿名方法与lambda表达式
- 匿名方法 VS Lambda表达式
- 匿名方法 与 Lambda 表达式
- Lambda表达式理解【匿名方法】
- 委托,匿名方法,lambda表达式
- 建议37:使用Lambda表达式代替方法和匿名方法
- Python 迭代器和生成器
- VC 各种情况下的窗口句柄的获取
- THREE.js 第二部分 canvas_camera_effect.html 内容分析
- elementUI 组件select 一个页面多次使用的情况
- mysql 免安装版配置
- 匿名方法、Lambda表达式和事件
- Android环境变量配置
- Django URLconfs 中通过包含其他URLconfs 来管理部分url相同的url
- Android获取相关目录
- 基于深度学习的自然场景文字识别
- Linux系统下强制踢掉登录用户
- 动态绑定 vs 静态绑定
- SrsAutoFree模式,避免内存泄漏和错误
- 面向对象设计原则之开闭原则