品味C#委托之奥秘
来源:互联网 发布:淘宝大学vip靠谱吗 编辑:程序博客网 时间:2024/04/30 05:29
委托可以算的上C#的语法精髓,如果说不懂委托就像不懂C#语言一样,一点儿都不为过。废话不多说,开始扯吧。
首先是最原始的状态
1.委托(delegate):
定义:
public delegate bool Compare(int a, int b); public int MyCompare(Compare selector, int a, int b) { return selector(a, b)?1:0; }public bool ECompare(int a, int b) { return a > b; }
调用:
Compare cpe=new Program().ECompare; bool result=cpe.Invoke(10,20);//也可以直接bool result=cpe(10,20); int val = new Program().MyCompare(cpe, 10, 20);//使用
让我联想到了接口,只是定义了方法的约束,并没有实现,具体实现的行为,是通过这行代码实现的:Compare cpe=new Program().ECompare;
对于这行代码,int val = new Program().MyCompare(cpe, 10, 20);,如果写过JavaScript的朋友是不是有种似曾相识的感觉?
我们将其简化,那么,可以写成这样:
int val = new Program().MyCompare(delegate (int a, int b) { return a > b; }, 10, 20);
这种形式称为匿名方法,可以使得委托的使用变得简洁,但是,这样仍然有很多不方便的地方,于是,微软为我们定义了两个超级好用的系统委托:
2:Action
由于我的Visual Studio安装了reshaper,F12跳转可能和大家的不一样,请看图:
这么多Action的意思是,T1-T8表示委托的参数,返回值类型为void
那么,有很多问题就可以迎刃而解了,由于我没有想到怎么给大家举例子,那么先暂时放一放,一会儿再用它。
3:Func,不废话了,
这么多Func的意思是:前N个参数表示委托的输入参数,最后一个参数表示返回参数的类型
我也暂时不举例子。
4:lambda表达式,lambda表达式可以说是C#的精髓中的精髓,它一般是这样的形式:
()=>{},其中左边的括号表示输入参数(一般我们可以不用写明它的类型,但是有时候编译器无法自动自动匹配类型的时候,需要写明,如果写明,不会报错),右边的花括号可有可无,其实就是函数的方法体。
那么,之前提到的Func和Action就好举例子了。我们写几个代表性的例子:
//private Func<int, bool> overTen = (a) => //{ // return a > 10; //}; private Func<int, bool> overTen = (a) => a > 10;
这两种写法的道理是一样的,可以根据自己的喜好写。
我们使用Action对List进行遍历,代码可以简单的让你无法想象:
new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }.ForEach(item => { Console.WriteLine(item); });
如果你查看ForEach的方法声明,可以发现它就是接收Action<T>类型
其实说到这儿,已经说到了LINQ的范畴了,我水平有限,只是简单的提一下吧,LINQ有三套,有LINQ to XML(专门操作XML),LINQ to Objects(典型代表就是我们在List中看到的很多方法),LINQ to Entities(用于操作数据库的有关的)
例如:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, TResult> selector);这是Select的其中一个定义,可以看到Func(注:IEumerable定义了这么Select多方法,List实现了IEnumerable,不难理解为什么会有三套LINQ,其实只是实现的方式不同,典型的多态)
5:Predicate:
我找了一个定义在List上的例子:public T Find(Predicate<T> match);
导航过去:public delegate bool Predicate<in T>(T obj);(是不是一个lambda表达式就OK了?哈哈)
我个人很多的关于委托的理解来源于金旭亮老师,向他致以最诚挚的谢意。
0 0
- 品味C#委托之奥秘
- C#小结之委托
- C#之委托
- C#之委托
- C# 之 委托
- C# 篇之---委托
- C#委托之愚见
- C#之初始委托
- C#之委托学习
- C#之委托
- C#学习之委托
- C#5.0之委托
- C#之委托
- c#之事件委托
- C#之委托
- C#之委托
- C#学习之委托
- C#之委托
- 1007. 素数对猜想 (20)
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
- linux 解压超过4gb的压缩文件
- Redis 实战 ---- Java 使用 Redis
- AngularJS第二日a
- 品味C#委托之奥秘
- 图案解锁——九宫格
- socket阻塞与非阻塞,同步与异步、I/O模型
- Hadoop使用学习笔记(3)
- jQuery 对AMD的支持(Require.js中如何使用jQuery)
- 35-003-1 struts文件上传要点.
- react-native android教程一(AS中使用react-native)
- 优先队列 POJ 2010
- href和src有什么区别