- 事件声明和使用部分的代码,防止多次注册事件主要通过判断事件中类型的委托实例是否为空实现
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);
}
}
}
补充一下个人见解,解决防止多次注册事件场景是同事遇到的,若代码结构设计合理和代码实现规范,其实这个问题不应该遇到。现实情况可能没有足够的时间去设计和规范实现,当业务越来越复杂代码量变大时可能会带来这个问题。