一、委托(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. Maven安装本地jar包

    mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.1.0 -Dpackaging= ...

  2. soapUI 再谈SoapUI接口测试--文件组织与接口“布局”管理

    再谈SoapUI接口测试--文件组织与接口“布局”管理 by:授客 QQ:1033553122 SoapUI-Pro-x64-5.1.2_576025(含破解文件),软件下载地址: http://pa ...

  3. ubuntu 搭建samba共享方案

    1.samba服务安装搭建 sudo apt-get install samba sudo vim /etc/samba/smb.conf workgroup = szsoft 设置用户密码登陆方式s ...

  4. 大数据【五】Hive(部署;表操作;分区)

    一 概述 就像我们所了解的sql一样,Hive也是一种数据仓库,不同的是hive是在hadoop大数据生态圈中所用.这篇博客我主要介绍Hive的简单表运用. Hive是Hadoop 大数据生态圈中的数 ...

  5. Oracle EBS OPM reshedule batch

    --reschedule_batch --created by jenrry DECLARE x_message_count NUMBER; x_message_list VARCHAR2 (2000 ...

  6. 搞定pycharm专业版的安装

    学习python也有一段时间了,装了python2,也装了python3.对于IDE当然首选了人人拍掌叫好的pycharm.其实作为小白,一开始的时候并不知道什么是IDE,什么是pychram,以为装 ...

  7. CSS| background_属性总结

    Property List 属性 描述 CSS background 在一个声明中设置所有的背景属性. 1 background-attachment 设置背景图像是否固定或者随着页面的其余部分滚动. ...

  8. 解决:Tomcat 局域网IP地址 访问不了

    解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...

  9. Zabbix添加Ping外网IP监控

    1.先添加一个HOST,只填写IP即可,如10.1.1.1 2.选择一台客户端,新建item,如下: 3.新建trigger: 注:icmpping[<target>,<packet ...

  10. [Errno 256] No more mirrors to try 解决方法

    安装tree时遇到问题yum [Errno 256] No more mirrors to try 解决方法: 1.yum clean all 2.yum makecache 3.yum update ...