一、委托:
完成一个委托应分三个步骤:
//step01:首先用delegate定义一个委托;
public delegate int CalculatorAdd(int x, int y);
//step02:声明一个方法来对应委托.
public int Add(int x, int y)
{
 return x + y;
}
protected void FrmTest_Load(object sender, EventArgs e)
{
 //step03:用这个方法来实例化这个委托.
 CalculatorAdd cAdd = new CalculatorAdd(Add);
 //int result = cAdd(5, 6);
 int result = cAdd.Invoke(5,6);
}
step01:首先用delegate定义一个委托.
step02:声明一个方法来对应委托.
step03:用这个方法来实例化这个委托.
至此,一个委托的应该就完成了,就可以调用委托了.
事件是委托的一个实例,此处暂且不说.

二、匿名方法:
匿名方法是用来简化上边的三个步骤的语法糖.
//step01:首先用delegate定义一个委托;
public delegate int CalculatorAdd(int x, int y);
protected void FrmTest_Load(object sender, EventArgs e)
{
 //step02:把一个方法赋值给委托
 CalculatorAdd cAdd = delegate(int x, int y) { return x + y; };
 //int result = cAdd(5, 6);
 int result = cAdd.Invoke(5,6);
}
step01:首先用delegate定义一个委托.
step02:把一个方法赋值给委托,其实这种写法就是匿名方法.

三、Lambda表达式:
微软对C#的设计理念是简单易用,对匿名方法再次进行简化,Lambda就出现了,几种lambda表达式的写法.
public delegate int CalculatorAdd(int x, int y);
protected void FrmTest_Load(object sender, EventArgs e)
{
 //方法一:
 CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
 int result1 = cAdd1(5, 6);

//方法二:
 CalculatorAdd cAdd2 = (x, y) => { return x + y; };
 int result2 = cAdd2(5, 6);

//方法三:
 CalculatorAdd cAdd3 = (x, y) => x + y;
 int result3 = cAdd2(5, 6);
}
方法一:简单的把delegate去掉,在()与{}之间加上"=>";
方法二:在方法一的基础上把参数类型干掉;
方法三:在方法二的基础上把{},以及return关键字都去掉了;

四、泛型委托:
不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步定义委托,另一步是用一个方法来实例化一个委托。
泛型委托把这两步合成一步。用Func来简化一个委托的定义,其中的Func就是所谓的泛型委托。如果委托函数是返回void,就将Func<>换成Action<>.
protected void FrmTest_Load(object sender, EventArgs e)
{
 //方法一:
 Func<int,int,int> cAdd1 = (int x, int y) => { return x + y; };
 int result1 = cAdd1(5, 6);

//方法二:
 Func<int, int, int> cAdd2 = (x, y) => { return x + y; };
 int result2 = cAdd2(5, 6);

//方法三:
 Func<int, int, int> cAdd3 = (x, y) => x + y;
 int result3 = cAdd3(5, 6);
}

五、表达式树:
表达式树是存放委托的容器,或者说是存取Lambda表达式的一种数据结构。要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。
protected void FrmTest_Load(object sender, EventArgs e)
{
 Expression<Func<int, int, int>> exp = (x, y) => x + y;
 Func<int, int, int> fun = exp.Compile();
 int result = fun(2, 3);
}

委托,匿名方法,Lambda,泛型委托,表达式树的更多相关文章

  1. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  2. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  3. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  4. C#多线程+委托+匿名方法+Lambda表达式

    线程 下面是百度写的: 定义英文:Thread每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它 ...

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

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

  6. Lambda表达式的演化,委托-匿名方法-Func-Lambda

    匿名方法 很多时候委托接收的方法是一次性的或者方法体是非常简单的... 例三: 我们可以写成: 有没有发现我们每次都要定义委托,很多时候签名可能是一样的.这样就没有必要定义重复的. 然后又过了很久很久 ...

  7. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

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

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

  9. lambda 委托 匿名方法

    委托: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的 ...

  10. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

随机推荐

  1. C#学习笔记之结构体

    1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...

  2. Slony-I双机备份

    测试环境:postgresql 9.3.5,slony-I2.2.3(application stack builder提供)以下参考网上教程亲自测试总结 ---------------------- ...

  3. 简单实用 “易忘” 的SQL 语句语法,新老皆宜

    --创建数据库 create database 数据库名 on primary ( name='数据库名_data',  filename='数据库储存路径', size=数据库初始大小(MB),   ...

  4. My SQL 常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...

  5. 在YouCompleteMe+Syntastic中添加和取消对C++11的支持

    添加对c++11的支持: /.vimrc中添加: let g:syntastic_cpp_compiler = 'g++'  "change the compiler to g++ to s ...

  6. ie6兼容性

    文本重复Bug 在IE6中,一些隐藏的元素(如注释.display:none;的元素)被包含在一个浮动元素里,就有可能引发文本重复bug.解决办法:给浮动元素添加display:inline;. 躲猫 ...

  7. Spark学习笔记--Transformation 和 action

    转自:http://my.oschina.net/hanzhankang/blog/200275 附:各种操作的逻辑执行图 https://github.com/JerryLead/SparkInte ...

  8. fiddler使用之坑

    今天一上午都在搞fiddler,之前可以抓到浏览器的请求,今天突然不行了,弄得我花一上午时间去设置浏览器代理的事情,遇到各种各样的问题,现将解决办法记录如下: 1.原来fiddler安装在E盘中,安装 ...

  9. css 设置字体

    CSS,font-family,好看常用的中文字体 例1(小米米官网):font-family: "Arial","Microsoft YaHei"," ...

  10. .NET知识点总结二(笔记整合)

    19.什么是类型? 用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法 20.this关键字在方法中使用时所代表的含义 this指的是当前类的对象,或者父类的类的对象(ba ...