.NET中的高级特性之“事件”

1 事件概述

       事件

             是一种使对象或类能够提供通知的成员。

             客户端可以通过提供“事件处理程序”为相应的“事件”添加可执行代码

      

       设计和使用事件的全过程

             (1). 如果需要的话,定义一个派生自System.EventArgs的参数类型

                 (即创建EventArgs类,以保存信息)

             (2). 在事件的管理类中定义“事件”

             (3). 通知事件订阅者(事件发送方法)

             (4). 事件使用客户端订阅/取消事件

 

2 示例

 

创建EventArgs类

///<summary>
///自定义一个事件参数类
///</summary>
public class AbcEventArgs : EventArgs
{
    ///存放消息
    private string _message;
    public string Message
    {
        get
        {
            return _message;
        }
    }

    #region 构造函数
    public AbcEventArgs()
        : base()
    {
        _message = string.Empty;
    }
    public AbcEventArgs(string message)
        : base()
    {
        _message = message;
    }
    #endregion 构造函数
}

 

创建事件管理类

 

//声明委托类 同时在C#中也存在”预定义委托” 如“EventHandler<TEventArgs>”可直接使用
public delegate void ChangedEvent(object sender, AbcEventArgs e);

public class AbcEventManager
{
    //声明一个“事件”Changed代表事件本身,同时也是“委托类”引用变量因此可代表编制的"事件处理函数"public event ChangedEvent Changed;

    //控制台输出
    public void Output(String message)
    {
        //使用已定义的参数类
        AbcEventArgs args = new AbcEventArgs(message);
        

        //在Output中控制台输出,引发另一个输出,接着调用“事件发送方法”
        Console.WriteLine(message);
           onChanged(args);
    }

    //事件发送方法,通知所有注册者。
    protected virtual void onChanged(AbcEventArgs e)
    {
        //如果Changed代表“事件处理函数”,在此作个检查
        if(Changed != null)
        //执行了Changed代表的函数
               Changed(this, e);
    }
}

              成员Changed将“事件”和“事件处理程序”联系起来了。注意OnChanged方法

 

事件的预定和取消

public class Test
{
    //事件处理函数
    static void Abc_Changed(object sender, AbcEventArgs e)
    {
        Console.WriteLine("同时引发了这个输出");
    }

    public void Process()
    {
        AbcEventManager aem = new AbcEventManager();

        //事件的预定
        aem.Changed+=new ChangedEvent(Test.Abc_Changed);

        //预定后则执行触发事件
        aem.Output("第一此输出");

        //事件的撤销
        aem.Changed -= new ChangedEvent(Test.Abc_Changed);

        //撤销后事件不触发事件
        aem.Output("第二次输出");
    }
}

执行

static void Main()
{
    Test test = new Test();
    test.aaaaa();
}

在控制台程序中program类加入以上三个类,Main()函数换成上图

 

结果

image

事件实际上实现了”observers模式”

 

3 总结

 

      事件是一种使对象或类能够提供通知的成员。客户端通过提供“事件处理程序”为相应的事件添加“可执行代码”。

 

      事件是一种特殊的委托。例如 EventHandler<ConsoleEventArgs>这个类型是一个“泛型委托类型”,它没有返回值,但有两个参数: object sender 和 EventArgs e。当事件使用者订阅事件时,本质是把"事件处理方法"加入到委托链表中。

posted @ 2012-02-15 21:08  达达杀猪丸子  阅读(255)  评论(0编辑  收藏  举报