一、委托(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. B2C,C2B,B2B,C2C,O2O,O2P

    B2C: 全称:Business-to-Customer 解释:商家对终端用户.通常说的商业零售,直接面向消费者销售产品和服务. C2B: 全称:customer to business 解释:终端用 ...

  2. 如何通过REST API登录Portal for ArcGIS

    Portal for ArcGIS 提供了两种登录方式:OAuth 2.0和传统的token登录方式. OAuth 2.0的登录原理在之前的一篇文章中已经描述,所以今天就不重复了.下面将介绍对于不支持 ...

  3. TLS/SSL测试工具

    常用的有SSLScan,我用的是OpenSSL的: openssl s_client -connect www.baidu.com:443

  4. View的measure机制

    Android中View框架的工作机制中,主要有三个过程: 1.View树的测量(measure)Android View框架的measure机制     2.View树的布局(layout) And ...

  5. 浅尝Java(一)

    主题:数据类型,数值类型变量相互转化 Java是强类型的语言,与JavaScript(松散型)在数据类型上有很大的差异(1.所有变量必须先申明,后使用:2.指定类型的变量只接受与之匹配类型的值).这个 ...

  6. Oracle EBS AP 取消发票

    --取消发票 created by jenrry 20170425 declare l_result BOOLEAN; l_message_name VARCHAR2(240); l_invoice_ ...

  7. eclipse在server中tomcat server找不到的问题

    想要在eclipse的server新建tomcat服务器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的红圈是tomcat server服务器(更新后才出现) 网上找的很久,只是找到 ...

  8. 解决:Determining IP Information for eth0...问题

    环境:Centos 6.2     VMWare Workstation 7.1.2  故障现象: 在虚拟机中启动Centos,在启动页面中停留在Determining IP Information ...

  9. SELinux 关闭方法

    临时关闭selinux,可执行: setenforce 0  // 设置selinux状态 1启用,0警告.不启用. getenforce   //检查selinux状态是否生效 永久关闭selinu ...

  10. 【转】Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

    [原文]https://www.toutiao.com/i6594587397101453827/ Java核心数据结构(List,Map,Set)使用技巧与优化 JDK提供了一组主要的数据结构实现, ...