【C#】C# 事件 两次 -= 会怎么样?

在 C# 中,事件(event)的 += 和 -= 运算符用于添加和移除事件处理器(delegate) 。以下是两次 -= 和 += 的具体行为:


🔁 两次 -=(移除)

示例代码:

csharp 复制代码
MyEvent -= Handler;
MyEvent -= Handler;

行为:

  • 第一次 -=: 如果 Handler 存在于事件列表中,它会被移除一次。
  • 第二次 -=: 如果此时 Handler 已不在事件中,则不会抛异常,也不会有任何效果。

✅ 是安全的,即使事件处理器已经不在里面了,也不会抛出异常。


🔁 两次 +=(添加)

示例代码:

csharp 复制代码
MyEvent += Handler;
MyEvent += Handler;

行为:

  • Handler 被添加了两次。
  • 当事件触发时,Handler 会被调用两次。

⚠️ 所以如果你不小心多次添加处理器,会导致 重复调用,可能产生性能问题或副作用(例如界面重复刷新、日志重复写入等)。


✅ 结论总结

操作方式 说明
+= 两次 添加两次,事件触发时会执行两次
-= 两次 第一次移除成功,第二次若找不到,忽略无异常
混用 += 和 -= 最后事件中处理器出现的次数 = 添加次数 - 移除次数

✅ 示例完整代码

csharp 复制代码
public event EventHandler MyEvent;

void Handler(object sender, EventArgs e) => Console.WriteLine("Handled!");

void Test()
{
    MyEvent += Handler;
    MyEvent += Handler;
    MyEvent -= Handler;
    MyEvent -= Handler;
    MyEvent -= Handler; // 这次不会抛异常,也不会有影响

    MyEvent?.Invoke(this, EventArgs.Empty); // 不会输出任何东西,因为都移除了
}
相关推荐
个 人 练 习 生10 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
2601_9669496510 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
坤坤子吖10 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
奋斗的阿狸_198611 小时前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
上位机妹子11 小时前
EF Core 两种继承映射:每层次一张表(TPH)与每类型一张表(TPT)
数据库·c#·.netcore·ef core
weixin1997010801611 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存
ACP广源盛1392462567311 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
niucloud-admin11 小时前
JAVA V6 多商户商城 开发文档——JAVA服务端
java·开发语言
轻舟技术A12 小时前
Pi 的 Rust 实现来了:rpi,不止一个终端 Agent
开发语言·后端·rust