【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); // 不会输出任何东西,因为都移除了
}
相关推荐
qiu_zhongya4 分钟前
iree 用C++来运行Qwen 2.5 0.5b
开发语言·c++·人工智能
汪宁宇4 分钟前
giflib5.2.2 在Qt与VS C++中实现Gif缩放示例
开发语言·c++·qt
啊?啊?10 分钟前
C/C++练手小项目之倒计时与下载进度条模拟
c语言·开发语言·c++
求一个demo19 分钟前
Qt5.14.2配置MSVC2017
开发语言·qt
西阳未落34 分钟前
C++基础(22)——模板的进阶
开发语言·c++
waves浪游34 分钟前
C++模板进阶
开发语言·c++
你的电影很有趣1 小时前
lesson68:JavaScript 操作 HTML 元素、属性与样式全指南
开发语言·前端·javascript
熊猫_豆豆1 小时前
MATLAB画出湖面波纹相遇所形成的现象
开发语言·matlab·仿真
Aevget1 小时前
界面控件DevExpress WinForms v25.1 - AI聊天控件功能持续增强
c#·界面控件·winform·devexpress·ui开发
csdn_aspnet2 小时前
在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
mongodb·c#·.netcore