码迷,mamicode.com
首页 > Windows程序 > 详细

C# 事件

时间:2015-04-17 11:28:33      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:c#   event   事件   

本篇文章我们来讨论C#中的事件。委托是事件的基础,了解委托请点击C#委托
我们先来看下面这个类

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public void ZhuangBi()
    {
        string topic="I am newbility";
        Console.WriteLine(topic);
    }
}

这个Person类有一个ZhuangBi方法,大家都知道,一个人关起门来装逼太没意思,所以我们希望在执行ZhuangBi方法时通知感兴趣的人,让他们知道我们在装逼。问题是怎么通知感兴趣的人呢?观察者模式可以将感兴趣的人抽象为接口,在Person类内部维护一个接口集合,在执行ZhuangBi方法时可以通知到所有感兴趣的人,可这不在我们讨论的范围内。这次我们通过C#的事件机制来实现对外界发出通知。
想用事件,必须先有委托,我们来定义一个委托

public delegate void ZhuangBi_Handler(string name, string topic);

有了委托之后,我们来改写Person类

public class Person
{
    public Person(string name)
    {
        this.Name = name;
    }
    public string Name { get; set; }
    public int Age { get; set; }

    public event ZhuangBi_Handler ZhuangBi_Completed;

    public void ZhuangBi()
    {
        string topic = "I am newbility";
        Console.WriteLine(topic);
        if (ZhuangBi_Completed != null)
        {
            ZhuangBi_Completed(Name, topic);
        }
    }
}

我们定义了一个ZhuangBi_Handler 类型的事件 ZhuangBi_Completed,在装逼完成后,我们来对外界发出通知。
下面我们编写一个类,来注册(或者叫订阅)这个事件。我们写一个粉丝类

public class Funs
{
    static void Main(string[] args)
    {
        Person person = new Person("kai_ge");
        person.ZhuangBi_Completed += person_ZhuangBi_Completed;
        person.ZhuangBi();
    }

    private static void person_ZhuangBi_Completed(string name, string topic)
    {
        Console.WriteLine("哇,{0}又开始装逼了,他说:{1}", name, topic);
    }

}

我们在类内部定义一个事件对象,可以被很多对象注册。当类的内部发生特定的行为时,我们在类内部可以向所有外部的注册者发送通知。
我们的这个类是如此的成功,在社会上产生了巨大的影响,也包括下面这个类

public class PoliceMan
{
    static void Main(string[] args)
    {
        Person person = new Person("kai_ge");
        person.ZhuangBi_Completed += person_ZhuangBi_Completed;
        person.ZhuangBi();
    }

    static void person_ZhuangBi_Completed(string name, string topic)
    {
        Console.WriteLine(name + ",我们怀疑你跟一起装逼案有关,请跟我们到警局接受调查,证据为:" + topic);
    }

}

备注:
1. 两个注册者都在Main函数中定义,如果你把代码复制到本地编译,两个注册者不能同时编译,你可以把一个注释掉。我之所以这么写,是为了降低订阅类的复杂性,否则又得定义一大堆类,这样我们的主题就跑偏了。
2. 装逼有风险,雨天要谨慎。

C# 事件

标签:c#   event   事件   

原文地址:http://blog.csdn.net/daguanjia11/article/details/45092847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!