C#防止多次注册事件

  • 事件声明和使用部分的代码,防止多次注册事件主要通过判断事件中类型的委托实例是否为空实现

    public class ReRegisterEvent
    {
    public delegate void Mydelegate(string message);
    private Mydelegate? mydel;
    public event Mydelegate Myevent
    {
    add
    {
    if (mydel == null)
    {
    mydel += value;
    }
    }
    remove
    {
    mydel -= value;
    }
    }
    public void WriteMessage(string message)
    {
    mydel?.Invoke(message);
    }
    }

  • 事件订阅和触发的代码,以下代码中多次注册后只执行一次注册的方法

    using NUnit.Framework.Internal.Execution;

    namespace SampleTestProject
    {
    public class Tests
    {
    [SetUp]
    public void Setup()
    {
    }

          [Test]
          public void Test1()
          {
              ReRegisterEvent reRegisterEvent = new ReRegisterEvent();
              reRegisterEvent.Myevent += Tests_Myevent;
              reRegisterEvent.Myevent += Tests_Myevent;
              reRegisterEvent.WriteMessage("");
              Assert.Pass();
          }
    
          private void Tests_Myevent(string message)
          {
              Console.WriteLine(message);
          }
      }
    

    }

补充一下个人见解,解决防止多次注册事件场景是同事遇到的,若代码结构设计合理和代码实现规范,其实这个问题不应该遇到。现实情况可能没有足够的时间去设计和规范实现,当业务越来越复杂代码量变大时可能会带来这个问题。

相关推荐
网络研究院16 天前
微软的 Drasi:一种轻量级的事件驱动编程方法
microsoft·微软·编程·驱动·事件·轻量级·drasi
青草地溪水旁18 天前
AUTOSAR_EXP_ARAComAPI的5章笔记(13)
事件·autosar ap·cm
网络研究院1 个月前
什么是托管安全信息和事件管理 SIEM?
安全·工具·管理·事件·信息·托管·功能
bobo-rs2 个月前
Laravel 中间件与事件应用教程
中间件·php·laravel·事件·events
Trouvaille ~2 个月前
【前端基础篇】JavaScript之jQuery介绍
前端·javascript·css·html·jquery·事件·选择器
Trouvaille ~2 个月前
【前端基础篇】JavaScript之DOM介绍
开发语言·前端·javascript·css·html·dom·事件
Amd7944 个月前
使用 useRequestEvent Hook 访问请求事件
前端·开发·hook·事件·ssr·请求·nuxt3
Y004 个月前
详解C#委托与事件
c#·.net·编程语言·委托·事件
韩曙亮4 个月前
【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )
前端·javascript·事件·web apis·事件源·时间处理程序
信必诺4 个月前
Excel 宏录制与VBA编程 —— 14、使用VBA处理Excel事件
excel·vba·事件