由于技术背景是C++起家的,所以对于C++的概念很清楚,遇到C#的EVENT时候,总感觉这个概念比较抽象,不容易理解,但是当使用函数指针和回调函数来理解EVENT的时候,这个概念就清晰了。
首先对于EVENT来讲,需要定义一个类,来定义Event和触发逻辑,这就是C++的动态库中定义一个函数指针,然后再定义这个指针的变量,这个在C#中可以说是一模一样的概念。
class ClassHasEvent
{
public delegate void TestEvent(object sender, EventArgs e);
public event TestEvent Event;
//触发Event的函数
protected void TriggerEvent(EventArgs e)
{
if (Event != null)
Event(this, e);
}
}
如果从回调函数来理解,就是定义被调用模块,在其中定义相关的函数指针的变量,同时在模块内部根据需要的逻辑出发对应的通知。
随后需要在调用模块中定义处理这个通知的函数,也就是C#中处理Event的类。在这个类的构造函数中需要传入对应的被调用模块的类。如下是倾听者对应的类。
class EventListener
{
TestClassHasEvent _inject;
public EventListener(TestClassHasEvent inject)
{
_inject = inject;
_inject.Event += new TestClassHasEvent.TestEvent(_inject_Handler);
}
public void _inject_Handler(object sender, EventArgs e)
{
}
}
有了如上的对应关系以后,理解C#的Event概念就很简单了,就是C++中的回调函数的概念,在C#中使用Event来实现。