事件与委托
1.基本写法
public class Publisher
{
//委托实际上相当于声明一个函数指针
public delegate void PublishEventHandler();
//事件相当于保存一个函数指针集合
public event PublishEventHandler Publish;
public void OnPublish()
{
if (Publish != null)
{
//调用事件
this.Publish();
}
}
}
public static void Recieve()
{
Console.WriteLine("Hello World");
}
public static void Main(string[] args)
{
Publisher publisher = new Publisher();
//对事件注册委托
publisher.Publish += new Publisher.PublishEventHandler(Receive);
//触发事件
publisher.OnPublish();
}
2.标准写法
//被观察者
public class Publisher
{
//委托的命名以EventHandler结束,参数第一个是sender,第二个是关于这个事件的参数类
public delegate void PublishEventHandler(object sender, PublishEventArgs e);
//事件的命名以Event结束
public event PublishEventHandler PublishEvent;
//引发事件以On开头
public void OnPublishEvent(PublishEventArgs e)
{
if(PublishEvent!=null)
{
this.PublishEvent(this, e);
}
}
}
//观察事件的参数
publish class PublishEventArgs: EventArgs
{
private string _bookname;
public string bookName
{
get{ return _bookname;}
set{ _bookname = value;}
}
public PublishEventArgs(string bookname)
{
this._bookname= bookname;
}
}
static void Main(string[] args)
{
Publisher publisher = new Publisher();
//注册事件
publisher.PublishEvent += new Publisher.PublishEventHandler(Receieve);
//构造事件参数然后引发事件
publisher.OnPublishEvent(new PublishEventArgs("para"));
Console.Read();
}
3.EventHandler写法
//观察事件参数
public class PublishEventArgs : EventArgs
{
private string _bookname;
public string bookName
{
get { return _bookname; }
set { _bookname = value; }
}
public PublishEventArgs(string bookname)
{
this._bookname = bookname;
}
}
//被观察者
public class Publisher
{
//public delegate void PublishEventHandler(object sender, PublishEventArgs e);
//这里不用再声明委托了,只用按照如下方式进行声明,则Pushlish对应的委托类型为(object sender, PublishEventArgs e)
public event EventHandler<PublishEventArgs> Publish;
public void OnPublishEvent(PublishEventArgs e)
{
//这里有简洁的写法Publish?.Invoke(this, e);
if (Publish != null)
{
Publish(this, e);
}
}
}
//观察者
public class User
{
public void Receieve(object sender, PublishEventArgs e)
{
Console.WriteLine(e.bookName + "Hello World!");
}
}
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
User Tom = new User();
publisher.Publish += Tom.Receieve;
publisher.OnPublishEvent(new PublishEventArgs("para"));
Console.Read();
}
}