C# event 事件系统

10 篇文章 0 订阅

声明事件

首先我们需要声明事件,也就是创造事件。

public event EventHandler RaiseCustomEvent; 
public event CustomEventHandler RaiseCustomEvent; 
public event EventHandler<CustomEventArgs> RaiseCustomEvent; 

解释(有三种方法):

  • 如果没有任何自定义 EventArgs 类,事件类型将为非泛型 EventHandler 委托;
  • 使用非泛型版本 EventHandler
    并且具有派生自 EventArgs 的自定义类,请声明发布类中的事件;
  • 如果使用泛型版本,则无需自定义委托;

例子

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

这句话相当于:

public delegate void CustomEventHandler( object sender, CustomEventArgs e );
public event CustomEventHandler RaiseCustomEvent;
public class CustomEventArgs : EventArgs 
{ 
	public CustomEventArgs(string s) 
	{ 
	message = s; 
	} 
	private string message; 
	public string Message 
	{ 
		get { return message; } 
		set { message = value; }
	} 
}

注册事件

然后某些地方可能会需要把自己的响应函数或者其它给注册都对应事件中去。
注册事件时,我们需要获取到我们之前创造的事件,我们可以为事件系统写一个全局的静态函数来操作,也可以通过对象来操作,我的想法是可以创造一个单例。
注册:

RaiseCustomEvent += HandleCustomEvent;

这里的HandleCustomEvent必须对应为我们之前创造(声明)事件时的委托或者是lambda表达式。
比如:

void HandleCustomEvent(object sender, CustomEventArgs e) 
{ 
	Console.WriteLine(" received this message: {0}", e.Message); 
}

因为我们前面是写的CustomEventArgs, 所以我们的响应函数,或者叫回调函数的类型就得是委托类型。

事件的调用

参数:

CustomEventArgs e

调用:

RaiseCustomEvent( this(对象) , e);

这里的this指触发事件的对象,比如上面的sender。比如我们的一个按钮被点击了,这个按钮就是这个对象,然后我们的事件参数e里面可以包含一些我们想要的信息,比如打开,关闭等命令。然后对应的接收方收到消息后,就会调用自己的回调函数,比如关闭自己的什么东西,打开什么东西。

例子

先自定义事件和委托

public class MyGameEventArgs : EventArgs
{
    public int num;
}
public delegate void MyHandler<T>(T i);

public static event MyHandler<MyGameEventArgs> HandEvent;

不同方法达到相同的目的:

  • Delegate
MyHandler<int> myHandler = new MyHandler<int>(CallBack);
myHandler += CallBack2;
myHandler += CallBack3;
myHandler?.Invoke(666);
  • Event

使用C#的event关键字定义的HandEvent

在这里插入图片描述
也声明了T的类型是MyGameEventArgs,其实与
在这里插入图片描述
代理实例在定义时相似,这里的申明类型是int

HandEvent += EventCallBack;
HandEvent += EventCallBack2;
HandEvent += EventCallBack3;
HandEvent?.Invoke(new MyGameEventArgs() { num = 999});

public static void EventCallBack(MyGameEventArgs num)
{
    Console.WriteLine(num.num);
}public static void EventCallBack2(MyGameEventArgs num)
{
    Console.WriteLine(num.num+1);
}public static void EventCallBack3(MyGameEventArgs num)
{
    Console.WriteLine(num.num+2);
}
public static void CallBack(int num)
{
    Console.WriteLine(num);
}
public static void CallBack2(int num)
{
    Console.WriteLine(num+1);
}
public static void CallBack3(int num)
{
    Console.WriteLine(num + 2);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值