委托、事件、匿名方法、Lambda
一、委托(delegate)
定义:public delegate void/类型 DefinedDelegate(参数1,参数2...)
委托是类型安全的. 委托实例:DefinedDelegate deleObj=new DefinedDelegate( fun ) //向委托构造函数传入方法名称
fun定义: public void/类型 fun(参数1,参数2...)
1)定义的委托返回类型与指向的方法返回类型一致; 2)委托的参数类型及个数与指向的方法参数类型及个数一致
tip:给定委托的实例可以引用任何类型的任何对象上的实例方法或静态方法,只要方法的签名匹配于委托的签名即可。
通过委托实例调用方法:deleObj(参数1,参数2...)
1、委托支持多路广播:一个委托变量可以传入多个委托实例(包含方法的) +=
注:多播委托调用时,如果有一个方法体执行异常,委托迭代会停止,后面的方法体将不会执行。
可按以下方式处理:GetInvocationList()返回Delegate对象数组
2、从委托调用列表移除成员: -+
3、方法组转换语法:允许直接将委托调用的方法赋给委托变量(替代等价=通过委托对象传入方法) deleObj=fun() ; deleObj +=fun2(); deleObj -=fun2();
4、委托协变:定义的委托类型返回自定义类型。
public delegate 自定义类型 DefinedDelegate(参数1,参数2...);
DefinedDelegate deleObj = fun; //此处fun()返回自定义类型
自定义类型 自*类实例 = (自定义类型)deleObj(参数1,参数2...);
5、泛型委托:定义类型参数来表示传入委托目标的实参。
public delegate void DefinedDelegate<T> (T arg);
二、事件(event)
简化自定义方法构建委托调用列表(增、删),自动提供注册和注销方法
public delegate void DefinedDelegate(string msg);
public event DefinedDelegate eventObj;
1、事件注册语法: eventObj = new DefinedDelegate(fun);
2、方法组转换:eventObj = fun ;
三、匿名方法
省去定义传入委托的方法. 用大括号包起,并以分号结束。
eventObj = delegate
{
//方法体内逻辑
}; eventObj1 = delegate (object sender,EventArgs e)
{
//方法体内逻辑
}
1、访问本地变量:匿名方法能够使用定义它的()本地变量,称这些变量为匿名方法的外部变量
1)匿名方法不能访问定义方法中的ref或out参数
2)匿名方法中的本地变量不能与外部方法中的本地变量重名
3)匿名方法可以访问外部类作用域中的实例变量(或静态变量)
四、Lambda表达式
用于简化匿名方法写法。
简化一:
List<int> list = new List<int>();
list.AddRange(new int [] {,,,});
List<int> evenNum=list.FindAll(
delegate(int i) {return (i%)==;}
);
简化二:
List<int> list = new List<int>();
list.AddRange(new int [] {,,,});
List<int> evenNum=list.FindAll(i=> (i%)==);
简化二(补充):
//...1
List<int> evenNum=list.FindAll( i=> (i%)==); //...2 显示定义表达式每个参数类型
List<int> evenNum=list.FindAll( (int i )=> (i%)==); //...3 (i)
List<int> evenNum=list.FindAll( ( i )=> (i%)==);
1、使用多个语句处理参数
//...
List<int> evenNum=list.FindAll( i=>
{
//...多行语句
//...
});
2、多个(零个)参数的Lambda表达式
Lambda提供一种简明的方式来定义匿名方法。
(msg,result)=>{ // ... };
(string msg, int result)=>{ // ... };
末尾一个实例(大括号扩起的一段C#语句,需要有返回值):
Datas = nodes.ToList().Select(s =>
{
var temp= s.MapTo<ScriptNodeOutput>();
temp.DbServerName = s.DbServer.ByName;
temp.ScriptNodeTypeName = s.ScriptNodeType.Name;
return temp;
} ).ToList(),
委托、事件、匿名方法、Lambda的更多相关文章
- C#委托总结-匿名方法&Lambda表达式
1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- C# 匿名委托、匿名方法、匿名对象、Lambda表达式
一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...
- c#-委托,匿名方法,lambda表达的关系
什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...
- 多播委托和匿名方法再加上Lambda表达式
多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
随机推荐
- 对象属性键值[key]属性问题
1,obj[key]此时key代表是循环中的一个变量. var obj = {key:3,key1:1,key2:2,key3:3,toSting:4}; for (key in obj) { con ...
- flex做的圣杯布局
now,给大家分享一个用flex写的圣杯布局,大家可以参考一下子 首先圣杯布局是两列固定宽度,中间自适应. 我直接说一下步骤,上图,上图 1.步骤1 2.步骤2 上面就是基本的步骤,下面我把代码给大家 ...
- 常用,好用的js代码
记录看到或者用到的js代码,长期更新! 判断是否是正整数 (number-0)|0 !== number-0 解析: number-0 转换成数字,再通过位移运算(|)判断是否跟原数字相等 安全检查j ...
- C#版Aliyun DNS API
阿里云解析API,是为域名开发者.注册商.域名代理商等提供的开放和便捷的解析服务接口.API依托于万网云解析服务,可以方便的管理域名和解析记录,让你的解析管理变的随心省时自由舒畅. 一.先附上Aliy ...
- 网络基础 利用vnc viewer访问在vmware虚拟机上的linux
利用vnc viewer访问在vmware虚拟机上的linux by:授客 QQ:1033553122 Linux服务器为架设在VMware之上的虚拟机,那么可以直接使用VMware自带的vnc,而不 ...
- python生成式和生成器
一,生成式和生成器 1,列表生成式 mylist = [ i*i for i in range(3) if i>1 ] print(mylist) 运行结果:[4] 可以发现,快速生成列表的表达 ...
- Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
新服务器搭建环境总是有很多问题.在安装MS SQL SERVER 2014 EXPRESS的时候提示无法安装成功,需要先安装 .NET Framework 3.5!但是新问题又来了,使用Windows ...
- 使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on)
使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on) 写在前面:我们在使用mysqldump备份数据时,请一定记住要加上 -q 参数,后果可能是很严重的,不要给自己挖坑哦. 先来看 ...
- Docker容器学习与分享11
容器的数据存储 容器在删除之后,里面所有的数据都会丢失,如果其他程序需要用到某一部分的数据那就没办法了. 所以可以将容器内的数据存储到容器之外,比如存储到宿主机内.(Docker提供了好几种方法) 将 ...
- 笔记本键盘开关方法 仅限window系统
按win键,搜索CMD(命令提示符).右键-以管理员身份运行.关闭笔记本键盘输入:sc config i8042prt start= disabled回车-重启电脑即可.需要重新启用键盘的话,输入:s ...