品味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
原创粉丝点击