事件(复习)

相关概念:

触发(raise)事件:调用或触发事件的术语。当事件被触发时,所有注册到它的方法都会被依次调用。

发布者(publisher):让事件被其他类或结构可见并使用的类或结构。

订阅者(subscribert):把事件和发布者关联注册的类或结构。

事件处理程序(event handler):注册到事件的方法。可以在事件所在的类或结构中,或者在不同的类或结构中。

 

事件与委托的关系

Event关键字会为我们做了两件事:

1.创建好一个对应的private的委托对象。

2.创建了一个【事件属性】,里面包含了addremove方法,他们都是直接操作上面的私有委托对象。

如下:

 

namespace 事件与委托的关系

{

    class Program

    {

        static void Main(string[] args)

        {

        }

    }

 

    class MyHandler

    {

        private string _name;

 

        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

 

        public event EventHandler MyEvent;

    }

}

 

  

生成Exe文件后,在反编译器里查看:

 

总结:

1.事件提供了对它的私有控制委托的结构化访问(创建了对应的私有委托对象字段,同时为该属性创建了addremove方法

2.与委托中的其他操作不一样,对于事件我们只可以添加、删除或调用事件处理程序(这个只是相对于订阅者所言,事件发布者可以使用委托其他操作【原因1】)。

3.事件被触发时,它调用委托来依次调用列表中的方法

4.事件是成员: 不能使用对象创建表达式(new表达式)来创建它的对象。

必须声明在类或结构中,和其他成员一样;

事件成员被隐式自动初始化为Null.

 

委托类型与EventHandler

 

复习的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 事件与委托的关系
{
    public delegate void MyDelegate();
    /// <summary>
    /// 订阅者类
    /// </summary>
    class Program
    {
        
        static void Main(string[] args)
        {
            Console.WriteLine("请输入任意字符继续……");
            Console.ReadKey();
            MyHandler mh = new MyHandler();
            //添加事件
            mh.MyEvent += addMethod1;
            mh.MyEvent += delegate { Console.WriteLine("你好,你调用了匿名方法"); };
            mh.MyEvent += () => { Console.WriteLine("你好,你调用了Lamada方法"); };
            mh.Test();
            Console.Read();
        }
        private static void addMethod1()
        {
            
            Console.WriteLine("你好,你调用了addMethod1方法");
            
        }
        private static void addMethod2()
        {

            Console.WriteLine("你好,你调用了addMethod2方法");

        }
        private static void addMethod3()
        {

            Console.WriteLine("你好,你调用了addMethod3方法");

        }
    }

    /// <summary>
    /// 发布者类
    /// </summary>
    class MyHandler
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        
        public event MyDelegate MyEvent;

        /// <summary>
        /// 触发事件的方法
        /// </summary>
        public void Test()
        {
            MyEvent();
        }
    }
}

 

  

 

posted @ 2012-09-02 20:26  生旦净墨丑  阅读(177)  评论(0编辑  收藏  举报