C#如何实现委托

这篇文章主要介绍了C#如何实现委托,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

宁陵网站建设公司成都创新互联,宁陵网站设计制作,有大型网站制作公司丰富经验。已为宁陵成百上千家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的宁陵做网站的公司定做!

    我们首先来看一个非常简单的例子:

namespace LinQ  {      //声明一个委托,这个委托可以指向任何传入两个整数并且返回一个整数的方法      public delegate int MathOP(int i, int j);        //这个类包含了MathOP将指向的方法Add      class DelegateMath       {          public static int Add(int i, int j) { return i + j; }      }        class Program      {          static void Main(string[] args)          {              //创建一个指向DelegateMath.Add()的委托              MathOP o = new MathOP(DelegateMath.Add);              //使用委托间接调用Add()方法              Console.WriteLine("10+20={0}",o(10,20));              //或者可以这样,如果不清楚o.Invoke,请继续往下看。如果您知道了,那这篇文章就可以忽略了             Console.WriteLine("10+20={0}", o.Invoke(10, 20));             Console.ReadLine();          }      }  }

运行结果是:

C#如何实现委托

    由这个简单的例子可见委托的使用非常简单,如果要将目标对象方法插入指定委托,只要向委托的构造函数传入方法名即可,当然这个方法要与定义这个委托时的返回值,参数类型以及个数都完全一样。这是我们就可以使用类似直接函数调用的语法来调用指向的成员:DelegateMath.Add(int i,int j);

    我们接着深入的讨论一下这个委托。东西嘛,不能光看表面,尤其是社会上的淫。不多说,"深入"之,先看一副图:

C#如何实现委托

这是一个反编译工具经过反编译之后出来的结果,主要看中间选中的那个LinQ.MathOP,这是我们定义的委托,它是一个类,但是我们并没有为这个类添加了那么多的不知道从哪里来的方法啊。其实当C#编译器处理委托类型时,它会先自动生成一个派生自System.MulticastDelegate的密封类。这个类与它的基类:System.Delegate一起为委托提供必要的基础设施。可以看到生成的MathOP类定义了三个公共方法。Invoke应该是核心方法,因为它被用来以同步的方式调用委托类型维护的每个方法,这里所谓的同步就是指调用者必须等待调用完成才能继续进行。BeginInvoke()和EndInvoke()方法能在第二个执行线程上异步调用当前的方法,这两个方法主要用在多线程上面,现在大家只要知道有这么个东西就行了,以后的博文会有持续的说明。 LinQ.MathOP的伪代码应该是这样的:

sealed class MathOP:System.MulticastDelegate {     public MathOP(object target,uint functionAddress);     public int Invoke(int i,int j);     public IAsyncResult BeginInvoke(int i,int j,AsyncCallback cb,object state);     public int EndInvoke(IAsyncResult result); }

    最后说明一下,委托还可以指向任意数量的out或ref参数(以及用params关键字标记的数组)的方法。如果包含了out或者ref参数,Invoke()以及BeginInvoke()方法的签名是一样的,但是EndInvoke()方法稍有变化,其中包括了委托类型定义的所有out或ref参数,当然,这个不需要我们的关心。

感谢你能够认真阅读完这篇文章,希望小编分享的“C#如何实现委托”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


本文名称:C#如何实现委托
URL链接:http://scyanting.com/article/iisoip.html