深入讲解C#中委托的+=和-=

这篇文章主要介绍了c#中委托的+=和-=深入研究,本文深入研究+=和-=在执行时都做了哪些事情,加深对c#委托的理解和使用,需要的朋友可以参考下

写在前面

为什么会突然想说说委托?原因吗,起于一个同事的想法,昨天下班的路上一直在想这个问题,如果给委托注册多个方法,会不会都执行呢?为了一探究性,就弄了个demo研究下。

+=

大家都知道委托都继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate,可以通过+=为委托注册多个方法。那么他们是否都执行了呢?执行的结果又是怎样的呢?有返回值和没返回值的是否结果是否一样?那就试着说说+=都干了哪些事?

测试代码

代码如下:

namespace Wolfy.DelegateDemo{    public delegate void ShowMsg(string msg);    public delegate int MathOperation(int a, int b);    class Program    {        static ShowMsg showMsg;        static MathOperation mathOperation;        static void Main(string[] args)        {            showMsg += ShowHello;            showMsg += ShowHello1;            showMsg("大家新年好啊");            mathOperation += Add;              mathOperation += Multiply;            int result = mathOperation(1, 2);            Console.WriteLine(result.ToString());            Console.Read();        }        static void ShowHello(string msg)        {            Console.WriteLine("哈喽:" + msg);        }        static void ShowHello1(string msg)        {            Console.WriteLine("哈喽1:" + msg);        }        static int Add(int a, int b)        {            return a + b;        }        static int Multiply(int a, int b)        {            return a * b;        }    }}

登录后复制

你可以猜猜运行结果,如下图:
深入讲解C#中委托的+=和-=

可以看到没有返回值的都输出了,有返回值的只输出了Mutiply的结果,那么+=内部做了哪些事?可以看一下反编译的代码:

代码如下:

using System;namespace Wolfy.DelegateDemo{    internal class Program    {        private static ShowMsg showMsg;        private static MathOperation mathOperation;        private static void Main(string[] args)        {            Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello));            Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello1));            Program.showMsg("大家新年好啊");            Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Add));            Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Multiply));            Console.WriteLine(Program.mathOperation(1, 2).ToString());            Console.Read();        }        private static void ShowHello(string msg)        {            Console.WriteLine("哈喽:" + msg);        }        private static void ShowHello1(string msg)        {            Console.WriteLine("哈喽1:" + msg);        }        private static int Add(int a, int b)        {            return a + b;        }        private static int Multiply(int a, int b)        {            return a * b;        }    }}

登录后复制

 通过上面的代码可以看出+=内部是通过委托的 Combine静态方法将委托进行组合的,可以看一下委托的这个静态方法是如何实现的。

深入讲解C#中委托的+=和-=

可以看到最终调用CombineImpl这个方法,这个方法内部很奇怪:

深入讲解C#中委托的+=和-=

并没有我们想看到的代码,那这个方法是干嘛用的啊?

MSDN的解释

Concatenates the invocation lists of the specified multicast (combinable) delegate and the current multicast (combinable) delegate.

大概意思就是:将当前的委托加入到指定的多播委托集合中。

绕了一圈那么有返回值的委托,到底执行了么?那也只能通过调试来看看了。(绕了一圈,又回到了编辑器,唉)

深入讲解C#中委托的+=和-=

继续F11你会发现确实进入了Add方法

深入讲解C#中委托的+=和-=

也确实执行了,但在遍历多播委托集合的时候,将之前的值给覆盖了。

深入讲解C#中委托的+=和-=那么现在可以得出这样的结论了:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。

-=

既然说了+=,那么作为收拾烂摊子的-=也不得不说。在项目中使用了+=就要使用-=来释放。那它内部做了哪些事?同样使用上面的代码,在输出结果后,使用-=来释放资源。

深入讲解C#中委托的+=和-=

可以看出,使用-=内部是调用了委托的Remove静态方法。

深入讲解C#中委托的+=和-=

深入讲解C#中委托的+=和-=

使用-=最终是将委托置为null,为null另一个意思就是空引用,这样就可以等待垃圾回收器进行回收了。

总结

这个问题虽然很基础,一个同事当时问了,就给他说了一下,在下班的路上一直在想,内部是如何实现的?就试着通过反编译的方式一探究竟。但貌似CombineImpl这个方法,给的结果不太满意。没看到具体的实现。希望对你有所帮助!

以上就是深入讲解C#中委托的+=和-=的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2443671.html

(0)
上一篇 2025年3月3日 14:13:48
下一篇 2025年3月3日 14:14:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 教你用C#制作最简单的登录界面

    我们在使用c#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。 首先我们来看一个简单的制作过程 打开visual 2010,新建窗体,既然是登录窗口…

    2025年3月3日 编程技术
    200
  • C#中把Image无损转换为Icon的实例详解

    这篇文章主要为大家详细介绍了c#无损转换image为icon的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 如题,市面上常见的方法是: var handle = bmp.GetHicon();  //得到图标句柄return Ic…

    编程技术 2025年3月3日
    200
  • FormDragger在C#中实现窗体拖拽器的方法详解

    这篇文章主要为大家详细介绍了c#组件formdragger窗体拖拽器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 适用:.net2.0+ winform项目 介绍: 类似QQ、迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,…

    2025年3月3日
    200
  • 关于C#中方法的阐述

    前言: C#中的方法在C#编程中经常会用到,那么什么是方法,方法怎么用呢?在这里总结一下,希望大家能指出我的缺点。 1 什么是方法    方法是C#中将一堆代码进行重用的一种机制。方法就是一段代码,这段代码可能有输入的值,可能会返回值。记得…

    编程技术 2025年3月3日
    200
  • 关于.NET(C#)正确读取中文编码文件的实例教程

    首先如果读者对编码或者bom还不熟悉的话,推荐先读这篇文章:.net(c#):字符编码(encoding)和字节顺序标记(bom)。中文编码基本可以分成两大类:1. ansi编码的扩展集合:比如gbk, gb2312, gb18030等,这…

    编程技术 2025年3月3日
    200
  • log4Net 高性能写入和CSV格式的实例详解

    最近在使用log4net,在使用之前我们必须知道文件流是如何操作的,否则就是盲人摸向。。。,在FileAppender.cs文件里面有LockingModelBase来控制流的锁,默认有3个子类 ExclusiveLock:默认的,Hold…

    2025年3月3日
    200
  • ANTS Performance Profiler(.NET性能调优教程)

    .NET性能调优系列文章 系列文章索引 .NET性能调优之一:ANTS Performance Profiler的使用 .NET性能调优之二:使用Visual Studio进行代码度量 .net性能调优之三:yslow相关规则的调优工具和方…

    2025年3月3日 编程技术
    200
  • .NET实现WebSocket服务端即时通信的实例详解

    本篇文章主要介绍了.net实现即时通信,websocket服务端实例 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 即时通信常用手段 1.第三方平台 谷歌、腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免…

    编程技术 2025年3月3日
    200
  • VS寻找C#的运行库文件

    这篇文章主要为大家详细介绍了visual studio寻找c#程序必要的运行库文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   在工程打包中,有时候很头痛的就是运行所需要的库文件不能够全面的包含进来,特别是有时候调用了一系列外部扩…

    2025年3月3日 编程技术
    200
  • 关于C#如何将Word转换成PDF的方法汇总

    这篇文章主要汇总了c#将word转换成pdf方法,基于office和wps的两种解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论