事件(event)构建在委托的基础上,他是C#的另一个重要功能。从本质上说,事件是一种信号机制,它在发生某种活动是自动地发出通知。
事件处理程序通过委托来表示。
event 关键字用于声明事件,这些事情可以作为类的成员。
最常用的事件声明方式为: event event-delegate event-name;
其中,event-delegate是支持事件的委托名称,event-name 是声明的具体事件对象的名称。
delegate void MyEventHandler();
class MyEvent
{
public event MyEventHandler SomeEvent;
public void OnSomeEvent()
{
if (SomeEvent != null)
SomeEvent();
}
}
class EventDemo
{
static void Handler()
{
Console.WriteLine("The handler is great!");
}
static void Main(string[] args)
{
MyEvent myEvent = new MyEvent();
myEvent.SomeEvent += Handler;
myEvent.OnSomeEvent();
Console.Read();
}
}
事件的其他特性
事件可以在接口中指定,实现接口的类必须提供事件。
事件可以被指定为抽象类型(abstract)。派生类必须实现事件。但是,基于存取器的事件不可用是抽象类型。
事件可以被指定为封闭类型(sealed)。
事件可以是虚时间(virtual),这表示它在派生类中可以被重写。
对事件使用匿名方法和拉姆达表达式
delegate void MyEventHandler();
delegate void ParamsEvent(string msg);
class MyEvent
{
public event MyEventHandler SomeEvent;
public event ParamsEvent ParamEvent;
public void OnSomeEvent()
{
if (SomeEvent != null)
SomeEvent();
}
public void OnParamEvent(string s)
{
if (ParamEvent != null)
ParamEvent(s);
}
}
class EventDemo
{
static void Main(string[] args)
{
MyEvent myEvent = new MyEvent();
//无参
myEvent.SomeEvent += delegate() { Console.WriteLine("‘匿名’事件"); };
myEvent.SomeEvent += () => { Console.WriteLine("‘拉姆达表达式’事件"); };
//有参
myEvent.ParamEvent += delegate(string a) { Console.WriteLine("{0}事件", a); }; //"‘匿名’"
myEvent.ParamEvent += a => { Console.WriteLine("{0}事件", a); }; //‘拉姆达表达式’
myEvent.OnSomeEvent();
myEvent.OnParamEvent("First,Second");
Console.Read();
}
}