千家信息网

C#如何实现委托

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要介绍了C#如何实现委托,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们首先来看一个非常简单的例子:namespace L
千家信息网最后更新 2024年12月13日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#如何实现委托"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

委托 方法 指向 篇文章 参数 类型 C# 这是 编译 东西 两个 例子 函数 整数 线程 结果 同步 生成 清楚 必要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器cpu和普通cpu的区别 湖北重点企业能耗上传软件开发 河北苹果软件开发大概要多少钱 因特网科技互联网大赛 数据库技术与应用第四章 北京英语软件开发哪个好 达梦数据库管理工具查询 游戏软件开发培训机构去哪个学校 北京服装外贸软件开发公司 浅谈网络安全与信息化工作 给学生普及网络安全法 阿里云腾讯云百度云服务器哪个好 lol第二局显示无法连接服务器 徐汇区软件开发技术服务值多少钱 云服务器无法玩网页游戏 服务器禁止外网访问 数据库显示置疑问题 政府网络安全应急演练计划 地税信息网络安全 当父母反对自己报网络安全专业 视频流服务器带宽 信息网络安全法渊源 江西特色软件开发要多少钱 江苏app软件开发大概要多少钱 软件开发事项可以转包 厦门凶宅数据库在线查询 腾讯云游戏服务器 柯尼卡美能达软件开发大连 电商数据库表结构设计 视频服务器连接不了
0