C#自学(一)委托(delegate)、委托泛型、多播委托

来源:互联网 发布:云计算开发工程师年薪 编辑:程序博客网 时间:2024/06/04 22:04

       为了开发windows phone应用程序,对于多年在java方向的我可谓从零开始,所以就抱着一本C#高级编程慢慢开始吭

从.net体系结构》》对象类型》》继承》》泛型》》委托

在这里不仅是为了分享自己的学习简介,也是为了以后来来查询学习。

废了这么多话,现在我们正式开始了


首先我们应该知道什么是委托,标识方法的类,它给方法的签名和返回类型指定名称(为方法指定别名,这是我的理解),它非常类似C++里面的函数指针,但是C#的委托是类型安全的,而C++的函数指针可以将任何一个地址作为函数指向,这就造成了不安全啦。可以通过定义的委托对象调用方法

一,简单的委托使用

定义委托的语法如下:

delegate int myDelegate(int input);

上面的语法定义了一个委托myDelegate,也就以一个方法的签名,包括方法的参数类型,返回值类型。注意:在定义委托时,必须给出它所表示的方法签名和返回类型等全部信息

我们定义了一个委托,那么如果使用了?

我们先定一个委托需要的方法:

int myFunc(int input){Debug.Console.WriteLine("you number is {0}",input};return input*input;}

然后我们给委托赋值,这里有两种方式实现:

第一种:

myDelegate = new myDelegate(myFunc);//括号里面只需要传入方法的名称即可,定义的委托必须与传入的方法签名一致

第二种:

myDelegate = myFunc;

最后就是调用我们的委托了:

int _output= myDelegate(100);//就像调用你定义的方法一样的方式来调用委托<pre class="csharp" name="code">int _output = myDelegate.Invoke(100);//也可以这样调用,产生的效果一样

二,关于Action<T>与Func<T>委托

Action<T>是不带返回参数的委托,Func<T>是带2有返回参数的委托,Action也叫多播委托,听不懂?没关系,后面我们慢慢到来。

1.我们来了解一下关于Func<T>的使用,Func<T>是委托的另一种使用方式。下面看一个简单的实例

 Func<int,int> testFunc=myFunc;//两个尖括号中,第一个表示的是传入参数的类型,最后一个表示的是返回值类型

调用方式:

int _output = testFunc(100);

Func<T>最多可以带入16个参数,最后一个参数都是表示函数的返回类型

更上一层楼,下面是我写的一个排序方法:

  <pre class="csharp" name="code">static void Sort<T>(IList<T> list, Func<T, T, bool> comparer)//这里就可以传入一个委托参数,用于比较        {            bool swapped = false;            do            {                swapped = false;                for (int i = 0; i < list.Count - 1; i++)                {                    if (comparer(list[i], list[i + 1]))                    {                        T temp = list[i];                        list[i] = list[i + 1];                        list[i + 1] = temp;                        swapped = true;                    }                }            } while (swapped);        }//我是这样使用的 int[] ints = { 1, 3, 1, 2, 23, 5, 34, 3, 43, 2, 343, 3532, 53, 2, 86, 33, 4, 10 };        Sort<int>(ints, (i, j) => i > j ? true : false);//不要疑惑,第二个参数是使用的lambda表达式,也可以使用函数定义//如下bool compare(int i,int j){return i>j?true:false;}Sort<int>(ints, compare);

2.下面讲解多播委托

所谓多播委托,就是一个委托可以顺序执行多个函数。

首先我们定义两个方法:

//多播委托不能带有返回值,如果有?只返回最有一个被加入的函数的返回值void one(int i){Debug.Console.WriteLine(i);}void two(int i){Debug.Console.WriteLine(i);}

现在定义一个多播委托:

Action<int> action = one;//int表示传入参数的类型

我们如何加入更多的委托呢?我们可以使用+或者+=的方式添加,相反,我们可以使用-或者-=的方式删除。其实在GUI编程中经常会看到+=的方式为事件添加执行函数,就是通过多播委托实现(在没有学习C#之前,有编写一个仓库管理软件,那时候也不知道为什么,但是就是这么用的,因为当时编写软件的时候业务逻辑重一些,所以没有系统的学习C#,因为C#很多东西和java是相通,上手容易)

例如添加新委托:

action+=two;

调用委托:

action(100);//这里就会自动的顺序的调用所有的委托,执行。

扩展:有时候会出现委托里面抛出异常,如果抛出异常,之后所有的委托都不会执行,因此我们还有一种手动执行的方式,你可以在你的代码里面捕获异常并处理,如下:

Delegate[] actions=action.GetInvocationList();foreach(Action<int>  a in actions){try{a(100);}catch(Exception e){//}}


三、匿名方法
        到目前为止,要想使委托工作,方法必须己经存在(即委托是用它将调用的方法的相同签名定义
的)。但还有另外一种使用委托的方式:即通过匿名方法。下面看一个简单的例子:

Func(string,string> dele = delegate(string param〉(return param*parame;)//这里就不需要事先声明委托



委托的初步使用就到这里啦,学习了为托一定要把lambda表达式学会,这回让你的代码看起来非常的美观优雅,编写代码也大大减少,很多开发这喜欢C#的原因貌似就有这个。

后续我会继续分享关于Lambda表达式的使用技巧。



0 0