Event 事件
事件的命名准则使用 PascalCasing 命名方式
- 事件名 EventName
- 委托名 EventNameEventHandler , 委托使用 void 作为返回值
- 在引发事件的类中提供一个受保护的方法,以 OnEventName 进行命名。在该方法中引发该事件。
Delegate 委托
委托是静态类型,只能用类名调用
class Program
{
class PubEventArgs : EventArgs
{
private readonly string m_magazineName;
private readonly DateTime m_PubDate;
public PubEventArgs(string magazineName, DateTime PubDate)
{
m_magazineName = magazineName;
m_PubDate = PubDate;
}
public string magazineName
{
get { return m_magazineName; }
}
public DateTime PubDate
{
get { return m_PubDate; }
}
}
class Publisher
{
//1 在事件发行者中定义一个事件
//1.1 声明与事件关联的委托类型
public delegate void PubMagazineEventHandler(object sender, PubEventArgs e);
//1.2 根据声明的委托类型,声明相应的事件
public event PubMagazineEventHandler PubMagazine;
//2 在事件发行者中触发事件
protected virtual void OnPubMagazine(PubEventArgs e)
{
PubMagazineEventHandler handler = PubMagazine;
if (handler != null)
{
handler(this, e);
}
}
public void issueMagazine(string magazineName, DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行" + magazineName);
OnPubMagazine(new PubEventArgs(magazineName, pubDate));
}
}
class Subscriber
{
//3 在事件订阅者中定义事件处理程序
public void Receive(object sender, PubEventArgs e)
{
Console.WriteLine("日期:" + e.PubDate);
Console.WriteLine("名称:" + e.magazineName);
}
}
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber();
Subscriber sub2 = new Subscriber();
//4 向事件发行者订阅一个事件
pub.PubMagazine += new Publisher.PubMagazineEventHandler(sub1.Receive);
pub.PubMagazine += new Publisher.PubMagazineEventHandler(sub2.Receive);
pub.issueMagazine("2012", Convert.ToDateTime("2011-12-29")); //触发事件
pub.PubMagazine -= new Publisher.PubMagazineEventHandler(sub2.Receive); //取消订阅事件
pub.issueMagazine("2012", Convert.ToDateTime("2011-12-30")); //触发事件
Console.ReadLine();
}
}
class Program
{
class NewEventArgs : EventArgs
{
}
class Publisher
{
public delegate void EventNameEventHandler(object sender, NewEventArgs e);
public event EventNameEventHandler EventName;
protected void OnEventName(NewEventArgs e)
{
EventNameEventHandler handler = EventName;
if (handler != null)
{
handler(this, e);
}
}
public void StartEvent()
{
OnEventName(new NewEventArgs());
}
}
class Subscriber
{
public void EventReceive(object sender, NewEventArgs e)
{
}
}
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
pub.EventName += new Publisher.EventNameEventHandler(sub.EventReceive);
pub.StartEvent();
pub.EventName -= new Publisher.EventNameEventHandler(sub.EventReceive);
pub.StartEvent();
}
}