C# 的 事件 与 EventHandler

事件接受与发送是通过 委托来实现的,随意,在学习事件之前一定要知道委托。

首先我们先看下图:请添加图片描述上的图不完整人,但大概是这个意思。

我们要创建一个事件管理。 来处理发布者发送消息和订阅者的接受消息中间转接。
然后订阅者去创建监听消息,然后,发布者再去触发事件。事件管理就会向所有监听该事件的订阅者去发布消息。当订阅者监听到消息后,会对其做一些相关的操作。大概就是这么个意思。

然后,我们开始写代码吧。首先,我们要去创建事件管理,其实就是一个委托,但创建的时候需要添加 关键字 event。

public delegate void EventManager();
class EventClass
{
    private static EventClass _instance;
    public static EventClass Instance
    {
        get
        {
            if (_instance == null)
                _instance = new EventClass();
            return _instance;
        }
    }

    // 创建一个事件管理对象
    private event EventManager eventManager;
    public void AddEventListener(EventManager arge)
    {
        eventManager += arge;
    }

    public void RemoveEventListener(EventManager arge)
    {
        eventManager -= arge;
    }

    public void DispatchEvent()
    {
        eventManager();
    }
}

我们创建了一个委托类型 EventManager 然后在 EventClass 类中创建了 添加 事件的方法 AddEventListener 移除监听事件 RemoveEventListener 和 分发事件 DispatchEvent
。当订阅者监听是后,就会去调用 AddEventListener 函数如下:

class EventClass1 
{
   public void PrintLog()
   {
       Console.WriteLine("EventClass1__PrintLog");
   }
}



EventClass1 event1 = new EventClass1();
EventClass.Instance.AddEventListener(event1.PrintLog);

这个时候,委托变量 eventManager 就会记录 event1 对象中的 PrintLog 函数正在监听着事件。当其他函数去执行 DispatchEvent 分发事件函数时,eventManager 会调用每一个监听事件函数。完整代码如下:

public delegate void EventManager();
 class EventClass
 {
     private static EventClass _instance;
     public static EventClass Instance
     {
         get
         {
             if (_instance == null)  
                 _instance = new EventClass();
             return _instance;
         }
     }

     // 创建一个事件管理对象
     private event EventManager eventManager;
     public void AddEventListener(EventManager arge)
     {
         eventManager += arge;
     }

     public void RemoveEventListener(EventManager arge)
     {
         eventManager -= arge;
     }

     public void DispatchEvent()
     {
         eventManager();
     }
 }

 class EventClass1 
 {
     public void PrintLog()
     {
         Console.WriteLine("EventClass1__PrintLog");
     }
 }

 class EventClass2
 {
     public void PrintLog2()
     {
         Console.WriteLine("EventClass2_PrintLog2");
     }
 }

 class Program
 {
     static void Main(string[] args)
     {
         EventClass1 event1 = new EventClass1();
         EventClass2 event2 = new EventClass2();

         EventClass.Instance.AddEventListener(event1.PrintLog);
         EventClass.Instance.AddEventListener(event2.PrintLog2);

         // 调用分发事件函数
         EventClass.Instance.DispatchEvent();
         Console.ReadKey();
     }
 }

运行结果如下:
EventClass1__PrintLog
EventClass2_PrintLog2

在这里创建事件委托的还可以使用 event 关键字简化

 public event EventManager eventManager;

// 创建一个事件管理对象
 //private EventManager eventManager;
 //public void AddEventListener(EventManager arge)
 //{
 //    eventManager += arge;
 //}

 //public void RemoveEventListener(EventManager arge)
 //{
 //    eventManager -= arge;
 //}

这样的话,就可以直接 使用 “+=” 方式来进行监听事件

EventClass.Instance.eventManager += event1.PrintLog;
EventClass.Instance.eventManager += event2.PrintLog2;

看完整的代码

public delegate void EventManager();
class EventClass
{
    private static EventClass _instance;
    public static EventClass Instance
    {
        get
        {
            if (_instance == null)  
                _instance = new EventClass();
            return _instance;
        }
    }

    public event EventManager eventManager;
    public void DispatchEvent()
    {
        eventManager();
    }
}

class EventClass1 
{
    public void PrintLog()
    {
        Console.WriteLine("EventClass1__PrintLog");
    }
}

class EventClass2
{
    public void PrintLog2()
    {
        Console.WriteLine("EventClass2_PrintLog2");
    }
}

class Program
{
    static void Main(string[] args)
    {
        EventClass1 event1 = new EventClass1();
        EventClass2 event2 = new EventClass2();

        EventClass.Instance.eventManager += event1.PrintLog;
        EventClass.Instance.eventManager += event2.PrintLog2;

        // 调用分发事件函数
        EventClass.Instance.DispatchEvent();
        Console.ReadKey();
    }
}

其实系统有给我们创建通用的事件委托 EventHandler,这样的话,我们就不需要自己定义委托了。直接可以使用通用委托来定义。在我们传递监听参数时就需要传递参数,带上两个参数。object 和 EventArgs 而输出的时候,也需要带上参数第一个就是委托所在类本身,第二个没有参数,可以传 null

public event EventHandler eventManager;
 //public void PrintLog()
 //{
 //    Console.WriteLine("EventClass1__PrintLog");
 //}

 public void PrintLog(object source, EventArgs e)
 {
     Console.WriteLine("EventClass1__PrintLog");
 }

```csharp
public void DispatchEvent()
{
     if (eventManager != null)
         eventManager(this, null);
 }

其他的基本上不用变化。输出还是一样的。

在使用通用委托时,有两个参数,其中 EventArgs 是可以传递参数的,但是要传递参数的话,必须继承 EventArgs 类来储存内容才能使用。而我们的委托也要用泛型委托。具体看下面代码:

public class EventArgsTest : EventArgs
{
     public int TestNum { get; set; }
 }

 class EventClass
 {
     private static EventClass _instance;
     public static EventClass Instance
     {
         get
         {
             if (_instance == null)
                 _instance = new EventClass();
             return _instance;
         }
     }

     public event EventHandler<EventArgsTest> eventManager;
     public void DispatchEvent()
     {
         EventArgsTest e = new EventArgsTest();
         e.TestNum = 10;
         if (eventManager != null)
             eventManager(this, e);
     }
 }

 class EventClass1
 {
     public void PrintLog(object source, EventArgsTest e)
     {
         Console.WriteLine("EventClass1__PrintLog = {0}", e.TestNum);
     }
 }

 class EventClass2
 {
     public void PrintLog2(object source, EventArgsTest e)
     {
         Console.WriteLine("EventClass2_PrintLog2 = {0}", e.TestNum);
     }
 }

 class Program
 {
     static void Main(string[] args)
     {
         EventClass1 event1 = new EventClass1();
         EventClass2 event2 = new EventClass2();

         EventClass.Instance.eventManager += event1.PrintLog;
         EventClass.Instance.eventManager += event2.PrintLog2;

         // 调用分发事件函数
         EventClass.Instance.DispatchEvent();
         Console.ReadKey();
     }
 }
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值