Unity项目中,见到了event事件,决定将它弄清楚。event事件是C#的固有属性,简单来说,就是发布者通过新建一个EventHandler对象,然后别的注册者可以注册事件到这个对象上面。当发布者需要有消息发布时,就会执行注册者注册的方法。此外,EventHandler是delegate,类似于C++的模板函数,就是符合EventHandler格式的方法都可以注册进来。
1)注册时,直接使用+=即可,例如
publisher.RaiseCustomEvent -= HandleCustomEvent;
2)取消时,直接使用-=即可,例如
publisher.RaiseCustomEvent -= HandleCustomEvent;
需要注意的是,注册和取消是不需要添加参数的。
3).Net Framework 2.0之后,推出了委托的泛型版本,即带消息时,带固定格式的消息,例如
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
下面贴出一个简单Demo,演示event事件是如何使用的,微软官方教程网站是点击打开链接
namespace CSharpTest
{
//继承自框架提供的EventArgs类
public class CustomEventArgs : EventArgs
{
//带个信息
private string message;
public CustomEventArgs(string s)
{
message = s;
}
public string Message
{
get { return message; }
set {message = value; }
}
}
public class Publisher
{
//新建event事件,这件事情是发布者做的
public event EventHandler<CustomEventArgs> RaiseCumstomEvent;
//执行事件
public void DoSomething()
{
OnRaiseCumstomEvent(new CustomEventArgs("Did Something"));
}
//具体执行事件的方法
protected virtual void OnRaiseCumstomEvent(CustomEventArgs e)
{
EventHandler<CustomEventArgs> handler = RaiseCumstomEvent;
if(handler != null)
{
e.Message += string.Format(" at {0}",DateTime.Now.ToString());
//执行所有注册的事件
handler(this,e);
}
}
}
//注册者类
class Subscriber
{
private string id;
public Subscriber(string ID,Publisher pub)
{
id = ID;
//注册事件, += 之后按tab自动出这个方法,约定俗成的名字
pub.RaiseCumstomEvent += pub_RaiseCumstomEvent;
}
//此处的sender对象即是发布者对象,e是发布者发过来的信息
public void pub_RaiseCumstomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(id + " received this message:{0}",e.Message);
}
}
class Program
{
static void Main(String[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1",pub);
Subscriber sub2 = new Subscriber("sub2", pub);
Subscriber sub3 = new Subscriber("sub3", pub);
pub.DoSomething();
//取消一个事件
pub.RaiseCumstomEvent -= sub3.pub_RaiseCumstomEvent;
Console.WriteLine("-------------------------------");
pub.DoSomething();
}
}
}
以后对event和delegate的理解加深以后再来补充。