当前位置:网站首页>C#中+=的用法
C#中+=的用法
2022-07-31 12:54:00 【黄昏和星空】
C#中, "+="有两种运用场合。
第一种,用在数值后面作为逻辑运算符,自加变量,如:
int i=0;
for(int j=0;j<5;j++)
{
i+=5;
}
这里i+=5表示i=i+5;
i的最终结果是25;
第二种,用于指定响应事件时要调用的方法;
这类方法称为事件处理程序,叫注册/订阅事件,用在操作类名后,比如
winForm.Closed += new EventHandler(child_Closed);
这句话意思是winForm的关闭结束事件订阅child_Closed方法,变量句柄类型为EventHandler常规事件句柄类型
再如 :
basisMstPage.btnClick_PageHandler += new EventHandler(this.BasisMasterPageButton_Click);
在此上下文中使用 += 运算符称为“注册事件”。
这里是 C# 事件绑定(注册、订阅)的特写用法,表示事件的处理程序集合中添加一个事件处理程序,它也有对应的 -= 来去掉之前 += 的事件处理程序。但事件发生时,所有此事件的处理程序集合中的处理程序都会依次调用。
无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。
+=
大家都知道委托都继承自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;
}
}
}
你可以猜猜运行结果,如下图:
可以看到没有返回值的都输出了,有返回值的只输出了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静态方法将委托进行组合的,可以看一下委托的这个静态方法是如何实现的。
可以看到最终调用CombineImpl这个方法,这个方法内部很奇怪:
并没有我们想看到的代码,那这个方法是干嘛用的啊?
MSDN的解释
Concatenates the invocation lists of the specified multicast (combinable) delegate and the current multicast (combinable) delegate.
大概意思就是:将当前的委托加入到指定的多播委托集合中。
绕了一圈那么有返回值的委托,到底执行了么?那也只能通过调试来看看了。(绕了一圈,又回到了编辑器,唉)
继续F11你会发现确实进入了Add方法
也确实执行了,但在遍历多播委托集合的时候,将之前的值给覆盖了。
那么现在可以得出这样的结论了:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。
-=
既然说了+=,那么作为收拾烂摊子的-=也不得不说。在项目中使用了+=就要使用-=来释放。那它内部做了哪些事?同样使用上面的代码,在输出结果后,使用-=来释放资源。
可以看出,使用-=内部是调用了委托的Remove静态方法。
使用-=最终是将委托置为null,为null另一个意思就是空引用,这样就可以等待垃圾回收器进行回收了。
总结
边栏推荐
- Double non-one into bytes!!Pure dry goods sharing
- 集群中增加数据节点与退役数据节点
- 求一份常见Oracle故障模拟场景
- FastAPI 封装一个通用的response
- Exploring Plain Vision Transformer Backbones for Object Detection Paper Reading Notes
- Full GC (Ergonomics)排查分析
- 字符函数和字符串函数
- Two methods of NameNode failure handling
- SAP ABAP OData 服务如何支持 $filter (过滤)操作试读版
- dosbox基础使用[通俗易懂]
猜你喜欢
Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
五种数据提交方式的优化
NameNode (NN) 和SecondaryNameNode (2NN)工作机制
串的基本概念与操作
Google Chrome(谷歌浏览器)安装使用
Anaconda安装labelImg图像标注软件
docker部署完mysql无法连接
log4j2的使用
字符函数和字符串函数
How does the SAP ABAP OData service support the $filter (filter) operation trial version
随机推荐
机器学习基本概念
FastAPI 封装一个通用的response
带有对称约束切换线性系统的结构可控性
集群的安全模式
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
365天挑战LeetCode1000题——Day 044 最大层内元素和 层次遍历
SAP ABAP OData 服务如何支持 $filter (过滤)操作试读版
亲测可用!!!WPF中遍历整个窗口的所有TextBox组件,对每个输入框做非空判断。
认知—运动康复医疗机器人应用设计
三相PWM整流器预测直接功率控制
sqlalchemy determines whether a field of type array has at least one consistent data with an array
Markdown编辑器语法
跨境电商小知识之跨境电商物流定义以及方式讲解
CentOS7 安装MySQL 图文详细教程
365-day challenge LeetCode1000 questions - Day 044 Maximum element in the layer and level traversal
SAP message TK 248 solved
SAP 电商云 Spartacus UI 和 Accelerator UI 里的 ASM 模块
Use docker to build mysql master-slave
Wearing detection and action recognition of protective gear based on pose estimation
NameNode (NN) and SecondaryNameNode (2NN) working mechanism