using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 事件练习3
{
class Program
{
static void Main(string[] args)
{
NewspaperOffice CNPO = new NewspaperOffice();
Subscriber zs = new Subscriber("张三");
CNPO.OnNespaperNewYorkTimes += new NewspaperOffice.NespaperNewYorkTimes(zs.Subscribe);//5,订阅事件(将事件处理程序添加到事件的调用列表中)
Subscriber ls = new Subscriber("李四");
CNPO.OnNespaperNewYorkTimes += new NewspaperOffice.NespaperNewYorkTimes(ls.Subscribe);
CNPO.OnNespaperChinaNews += new NewspaperOffice.NespaperChinaNews(ls.Subscribe);
CNPO.issueNewYorkTimes();//6,触发事件[张三李四都订阅了]
CNPO.issueChinaNews();//[李四订阅了]
Console.WriteLine();
Console.WriteLine("一年后");
CNPO.OnNespaperNewYorkTimes -= new NewspaperOffice.NespaperNewYorkTimes(ls.Subscribe);
CNPO.issueNewYorkTimes();//[张三订阅]
CNPO.issueChinaNews();//[李四订阅]
Console.ReadKey();
}
}
class NewspaperOffice //A.定义1个<报社>类
{
public delegate void NespaperNewYorkTimes(string NespaperName);
public delegate void NespaperChinaNews(string NespaperName);//1,声明2个委托
public event NespaperNewYorkTimes OnNespaperNewYorkTimes;
public event NespaperChinaNews OnNespaperChinaNews;//2,声明事件
public void issueNewYorkTimes() //3,触发事件的方法
{
if(OnNespaperNewYorkTimes !=null)
{
Console.WriteLine("出版<纽约时报>");
OnNespaperNewYorkTimes("<纽约时报>");
}
}
public void issueChinaNews()
{
if (OnNespaperChinaNews != null)
{
Console.WriteLine("出版<中国新闻>");
OnNespaperChinaNews("<中国新闻>");
}
}
}
class Subscriber//B.定义<订阅人>类---4,定义事件处理程序
{
private string name;//有名字
public Subscriber(string name) //获取名字
{
this.name = name;
}
public void Subscribe(string NespaperName)//可以订阅报纸
{
Console.WriteLine("{0}订阅了{1}报纸",name,NespaperName);
}
}
}
1>事件的命名准则应使用PascalCasing命名方式
(每个单词的首字母大写)
2>声明delegate时,
必须使用void类型当作返回值,EventName事件的事件委托是
EventNameEventHandler,事件接受两个传入的参数,一律命名为sender与e。
3>定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从System.EventArgs派生该类,然后添加所有事件特定的成员。
sender的类型必须是object的
例如
public
delegate void EventNameEventHander(
object sender,EventNameEventArgs e);