一、委托(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的更多相关文章

  1. C#委托总结-匿名方法&Lambda表达式

    1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...

  2. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  3. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  4. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  5. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  6. C# 匿名委托、匿名方法、匿名对象、Lambda表达式

    一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...

  7. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  8. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

  9. 多播委托和匿名方法再加上Lambda表达式

    多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...

  10. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

随机推荐

  1. MySql概念及常用Sql

    MySQL是一个关系型数据库管理系统 MySQL启动命令: 本机mysql地址D:\pefession\mySql\mysql-8.0.12-winx64\bin 启动服务:net start mys ...

  2. JSON.parse()与JSON.stringify()高级用法

    JSON.parse()与JSON.stringify是将JSON对象与字符串互相转换的方法,它们还有一些参数可以让我们在实际应用中更加方便,现在介绍一下它们的高级用法 JSON.parse() JS ...

  3. Flask结合Redis消息队列实现电影弹幕

    用到的弹幕播放器插件:dplayer.js(开源) 1.安装Redis 2.安装flask-redis包 pip install flask-redis3.下载dplayer 页面搭建 1.引入资源 ...

  4. Oracle中Database Link的创建和Synonyms

    在工作中我遇到过这样的一个问题,就是当我需要将远程主机上Oracle数据中某个表的数据copy到本地Oracle时,有多种方法可以实现.1.将所需要的数据导出到csv或其他格式的文档,复制到本地进行直 ...

  5. 纯js实现页面返回顶部的动画

    啥也不说了,直接上代码 var scrollTop = document.body.scrollTop; document.body.style.marginTop = -scrollTop + 'p ...

  6. SpringBoot_Mybatis_Maven_BootStrap

    ​​​ 需要eclipse 配置maven 未完,待续 链接:https://pan.baidu.com/s/1vej2zEdJmKeMUJD9S1B5MA 密码:y5j9

  7. Windows DHCP备份还原命令

    DHCP服务器如果要更换,最简单的方法就是命令导入导出   导出netsh dhcp server export e:\dhcp.txt all 导入netsh dhcp server import ...

  8. replace 用法

    orcl中replace()用法: replace:(字符串 | 列):进行替换: 将bqh1表中name列带“小”的字改成“大”: select * from bqh1select a.*,repl ...

  9. Eclipse中Tomcat的配置

    1.Window-Preferences-Server-Runtime Environments 2.点击Add,选择相应的Tomcat版本,我的是7.0的所以我选择这个.并勾选Create a ne ...

  10. sysbench压力工具报错:

    [root@ sysbench-]# /usr/local/sysbench/bin/sysbench --version : cannot open shared object file: No s ...