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(); } } }
运行结果是:
由这个简单的例子可见委托的使用非常简单,如果要将目标对象方法插入指定委托,只要向委托的构造函数传入方法名即可,当然这个方法要与定义这个委托时的返回值,参数类型以及个数都完全一样。这是我们就可以使用类似直接函数调用的语法来调用指向的成员:DelegateMath.Add(int i,int j);
我们接着深入的讨论一下这个委托。东西嘛,不能光看表面,尤其是社会上的淫。不多说,"深入"之,先看一副图:
这是一个反编译工具经过反编译之后出来的结果,主要看中间选中的那个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#如何实现委托"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!