委托:html
delegate是C#中的一种类型,它其实是一个可以持有对某个方法的引用的类。与其它的类不一样,delegate类可以拥有一个签名(signature),而且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分类似。它容许你传递一个类A的方法m给另外一个类B的对象,使得类B的对象可以调用这个方法m。但与函数指针相比,delegate有许多函数指针不具有的优势。首先,函数指针只能指向静态函数,而delegate既能够引用静态函数,又能够引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,并且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime可以保证delegate指向一个有效的方法,你无须担忧delegate会指向无效地址或者越界地址编程
委托传送文 :http://www.javashuo.com/article/p-ubzkzfab-e.html安全
匿名方法:编程语言
匿名方法(Anonymous methods) 提供了一种传递代码块做为委托参数的技术。匿名方法是没有名称只有主体的方法。函数式编程
在匿名方法中您不须要指定返回类型,它是从方法主体内的 return 语句推断的。函数
匿名方法传送文 :http://www.runoob.com/csharp/csharp-anonymous-methods.htmlspa
Lambda:.net
这里介绍C# Lambda表达式,它实际上和匿名方法没有什么不一样。Lambda的输入参数就对应着delegate括号里面的参数,因为C# Lambda表达式能够推断参数的类型,因此这里的参数无需声明。
C#语言仍是比较常见的东西,这里咱们主要介绍C# Lambda表达式,包括介绍一个Lambda就是一个delegate,一个delegate指向一个方法等方面。
你有没有接触过C# Lambda表达式,有没有以为匿名方法这东西很不错,减小了不少代码阿,可是匿名方法的使用还并不人性化,什么是人性化呢?好比你能够用天然的语言将程序代码读出来,这样才算人性化了。在.net 2.0中System.Collections.Generic命名空间下List里有一些新增的方法。好比Find,若是使用匿名方法咱们如何调用呢:
- books.Find(delegate(Book book){return book.Price <50;});
代码是很简单,可是却没法朗读出来,来看看C# Lambda表达式的写法:
books.Find(book=>book.Price<50);这个C# Lambda表达式就能够这样阅读出来了:给你一本书,若是它的价格小于50则返回true。
好了,那咱们就走进C# Lambda表达式吧:指针
将使用了C# Lambda表达式的程序集反编译后,咱们发现,它实际上和匿名方法没有什么不一样。Lambda的输入参数就对应着delegate括号里面的参数,因为C# Lambda表达式能够推断参数的类型,因此这里的参数无需声明。
Lambda操做符读做”Goes to”,它后面紧跟着表达式或者是语句块(这点和匿名方法也不一样,匿名方法只能使用语句块而不能使用表达式),下面我就用实例来讲明一下有那些类型的C# Lambda表达式:
//x的类型省略了,编译器能够根据上下文推断出来,后面跟着的是表达式
- x => x+1
deleage(int x){return x+1;}
- //后面跟着的是语句块
x=>{return x+1;}
- delegate(int x){return x+1;} //输入参数也能够带类型,带类型后别忘记小括号哦
- (int x) => x+1
delegate(int x){return x+1;}
- //也能够多个输入参数,逗号分隔,别忘记小括号 (x,y) => x+y
- delegate(int x,int y){return x+y;} //无参的也行
- () => 1
- delegate(){return 1;}
对于C# Lambda表达式来讲她的用法就是如此,可是在Lambda背后却有不少的故事和玄机。用C# Lambda表达式能够构建表达式树,而表达式树对于Linq来讲就像树根对于树同样重要。在这里就不讨论表达式树的问题了,这个东西也不是三言两语可以说清楚的,等待时机成熟的时候咱们再来进一步讨论。
C# Lambda表达式更多阅读htm
Lambda实际上源远流长,咱们如今使用的机器都是冯-诺依曼体系的,属于图灵机,在那以前还有一种称做λ演算的理论,可是图灵机因为先被实现出来,因此大行其道,λ 演算后来成就了函数式编程语言特别是Lisp,在函数式编程语言里函数是第一等元素,函数的参数,函数的返回值都是函数,程序没有变量,函数嵌套函数。并且函数式编程语言一直存在于象牙塔中,因此在工业界并无获得通用,不过近年来工业界比较喜欢“复古”风格,因此函数式编程语言也慢慢的走上了历史的舞台。函数式编程能解决一些命令式编程难以解决的问题(或者解决起来很是麻烦)。C#要作到函数风格编程怎么办?靠原来的方法
定义的方式确定是不可行的,2.0的匿名方法从某种程序上来讲解决了这个问题,但仍是不够,3.0里的Lambda终于很好的解决了,一个Lambda就是一个delegate,一个delegate指向一个方法,如今咱们使用Lambda也能简单的将方法做为参数传递了,还能够层层嵌套,都是很简单的事情了。
资料转载:特别鸣谢