C#如何实现委托

发布时间:2021-10-21 14:23:46 作者:小新
来源:亿速云 阅读:145

这篇文章主要介绍了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#如何实现委托”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. C# 委托及事件
  2. C#委托和事件

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:如何用PyQt打造具有专业外观的GUI

下一篇:替换轻松上手Milvus Admin

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》