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);
          }
      }
    

    }

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

相关推荐
韩曙亮7 天前
【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )
前端·javascript·事件·web apis·事件源·时间处理程序
信必诺10 天前
Excel 宏录制与VBA编程 —— 14、使用VBA处理Excel事件
excel·vba·事件
martian66514 天前
学懂C#编程:从一个简单的例子理解事件处理
开发语言·c#·委托·事件·event
我叫白小猿23 天前
【仿真建模-anylogic】EventCondition原理解析
java·仿真·事件·anylogic·条件
Mr.codeee3 个月前
libVLC 视频裁剪
qt·音视频·事件·libvlc
dzweather3 个月前
C#事件实例详解
c#·事件·主构造函数·模态
Mr.codeee3 个月前
libVLC 捕获鼠标、键盘事件
qt·音视频·事件·libvlc
老歌老听老掉牙3 个月前
概率论基础概念
概率论·事件·频率·随机试验
爱敲代码的菜菜3 个月前
【前端】Web API
开发语言·前端·javascript·dom·webapi·事件