C# 事件
程序员文章站
2022-03-25 10:29:39
...
C# 事件
事件简介
Microsoft Docs上的解释:
事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知。
这样说比较抽象,打个比方:你有一只看门狗,如果小偷来了,你的狗会叫,你听到狗叫就会起来抓小偷,这就是狗向你广播小偷来了这件事。
事件的特点
- 事件有三个要素:事件拥有者、事件订阅者、事件处理方法
- 事件拥有者:也叫事件发布者,个人觉得用拥有者更方便理解,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者。
- 事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象。
- 事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法。一般来说,事件处理方法是定义在事件订阅者中。
以刚才的例子继续:狗叫是事件,那么狗是事件拥有者,主人是事件订阅者,起来抓小偷是听到狗叫后的事件处理方法。
- 事件是建立在对委托的语言支持之上的,用于定义事件以及订阅或取消订阅事件的语法是对委托语法的扩展。
因为事件常用定义是用关键字event修饰的委托,事件的处理方法就是委托对象需要赋值的内容。事件的订阅就是将事件的处理方法赋值给事件的过程。
源代码分析
/*
代码实现:主人发出吃饭的信号,三只狗收到信号并作出反应,因此这是一个多播委托(有多个事件的订阅者)
*/
public class DogEvent : EventArgs //事件参数,和理解无关
{
public string message { get; set; }
public DogEvent(string s)
{
message = s;
}
}
public class Host3
{
public event EventHandler<DogEvent> Feed;//此处定义了一个事件,Host3拥有事件
//public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e),从签名可以看出EventHandler就是预定义的委托。
public void PrepareFeed()
{
Console.WriteLine("我是主人,准备好狗粮了!狗狗们快来!");
OnFeed(new DogEvent("来了"));
}
protected virtual void OnFeed(DogEvent e)
{
EventHandler<DogEvent> handler = Feed;
if(handler != null)//事件未被订阅
{
e.message += String.Format(" 现在是 {0}", DateTime.Now.ToString());
handler(this, e);//此处事件发生
}
/*方便理解的话,可以不定义这个handler,直接将handler换成Feed
if(Feed != null)
{
e.message += String.Format(" 现在是 {0}", DateTime.Now.ToString());
Feed(this, e);//此处事件发生
}
*/
}
}
public class Dog3
{
public string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Dog3(string name, Host3 MyHost)
{
this.name = name;
MyHost.Feed += DogEventHandler;//订阅事件,订阅者是Dog3,事件处理程序是DogEventHandler
}
void DogEventHandler(object sender,DogEvent e)
{
Console.WriteLine("我是狗狗{0} {1}",name,e.message);
}
}
class Program
{
static void Main()
{
Host3 MySelf = new Host3();
Dog3 dg1 = new Dog3("小黄",MySelf);
Dog3 dg2 = new Dog3("小黑", MySelf);
Dog3 dg3 = new Dog3("小花", MySelf);
MySelf.PrepareFeed();//主人准备开饭了
}
}
参考资料
下一篇: ubuntu安装mysql的方法