委托、事件、匿名方法、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 ...
随机推荐
- 微信小程序 折叠效果
<view class='help'> <view class='help_item'> <view class='title' data-index='1' catch ...
- drupal7 覆写node-type.tpl.php获取字段值的两种方式
字段的机读名称为:field_publication_date <!-- 下面两种方式都可以获取node字段的值--> 出版时间: <?php print date('Y-m-d', ...
- 搭建ReactNative时的最普遍的错误—— ":CFBundleIdentifier", Does Not Exist
报错 ":CFBundleIdentifier", Does Not Exist 今天搭建Reactnative 报错 注意当你第一次搭建RN时,包体下载的都是最新的版本,由于现在 ...
- Android解析WindowManager(一)WindowManager体系
前言 WindowManagerService(WMS)和AMS一样,都是Android开发需要掌握的知识点,同样的,WMS也很复杂,需要多篇文章来进行讲解,为何更好的理解WMS,首先要了解Windo ...
- Android应用程序启动过程(一)总结
一.App启动方式 1,冷启动 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用. 冷启动的特点:因为系统会重新创建一个新的进程分配给它,所以会创建和初始化App ...
- 在Docker Swarm上部署Apache Storm:第1部分
[编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...
- 跨过Django的坑
在最近的Django的学习中,慢慢的开始踩坑,开此栏,专为收纳Django的坑,在以后的学习中以便警示.(使用工具为pycharm专业版2018.2.4,python3.5.2,Django版本2.1 ...
- mysqldump: Error 2013
最近在mysqldump时,遭遇mysqldump: Error 2013错误.以为是常见的参数设置有问题,调整之后,也没有任何成效.原来发生了OOM,以下是其具体描述. 一.故障现象 环境 # mo ...
- 从零起步做到Linux运维经理,你必须管好的23个细节
不想成为将军的士兵,不是好士兵-拿破仑 如何成为运维经理?成为运维经理需要什么样的能力?我想很多运维工程师都会有这样的思考和问题. 如何成为运维经理.一般来说,运维经理大概有两种出身,一种是从底层最基 ...
- JavaScript原型链基础(prototype chain)
1.函数基础 2.对象基础 3.原型链基础