当前位置:编程学习 > C#/ASP.NET >>

新手求助(关于事件)


    class PubEventArgs : EventArgs
    {
        private readonly string m_magazineName;
        private readonly DateTime m_pubDate;

        public PubEventArgs(string magazineName, DateTime pubDate)
        {
            m_magazineName = magazineName;
            m_pubDate = pubDate;
        }
        public string MagazineName
        {
            get { return m_magazineName; }
        }
        public DateTime PubDate
        {
            get { return m_pubDate; }
        }
    }
    class Publisher  //出版者
    {
        public delegate void PubComputerEventHandler(object sender,PubEventArgs e);//声明事件所需的代理
        public delegate void PubLifeEventHandler(object sender, PubEventArgs e);

        public event PubComputerEventHandler PubComputer;//事件的声明
        public event PubLifeEventHandler PubLife;

        protected virtual void OnPubComputer(PubEventArgs e)
        {
            PubComputerEventHandler handler = PubComputer;  //疑问1.
            if (handler != null)
            {
                handler(this,e);//疑问2            }
        }
        protected virtual void OnPubLife(PubEventArgs e)
        {
            PubLifeEventHandler handler = PubLife;
            if (handler != null)
            {
                handler(this, e);
            }
        }
        public void issueComputer(string magazinName,DateTime pubDate)  //触发事件的方法
        {
            Console.WriteLine("发行"+magazinName);
            OnPubComputer(new PubEventArgs(magazinName, pubDate));
        }
        public void issueLife(string magazinName, DateTime pubDate)
        {
            Console.WriteLine("发行" + magazinName);
            OnPubLife(new PubEventArgs(magazinName, pubDate));
        }
    }

    class Subscriber  //订阅者
    {
        private string name;
        public Subscriber(string name)
        {
            this.name = name;
        }
        public void Receive(object sender,PubEventArgs e)  //在事件订阅者中定义事件处理程序
        {
            Console.WriteLine(e.PubDate+" "+name+"已经收到了"+e.MagazineName);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher Pub = new Publisher();
            Subscriber zs = new Subscriber("张三");
            Subscriber ls = new Subscriber("李四");
            Pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive);  //向事件发行者订阅一个事件
            Pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive);
            Pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
            Pub.issueComputer("电脑杂志",Convert.ToDateTime("2006-1-1"));
            Pub.issueLife("生活杂志",Convert.ToDateTime("2006-6-1"));
            Console.ReadKey();
        }
    }
疑问:1.PubComputerEventHandler handler = PubComputer;  
          handler是一个委托类型,PubComputer是声明的一个事件,这句话代表什么意思呢?
      2.handler(this,e);
          这句话就彻底不理解了。
   还望高手们不吝赐教,指点一下我们这些初学者。 --------------------编程问答-------------------- 说明一下啊,本人不是高手,也是一直小鸟飞啊飞。。

你这里说的委托和事件
先理解一句话:委托 就是可以把方法当做参数进行传递的,事件 其实可以说是一个特殊的委托吧,它是有1个或N个委托组合起来的委托。

PubComputerEventHandler handler = PubComputer  这句话很好理解,就是申明嘛,以委托PubComputerEventHandler 为类型。
就比如 Class A =a;

这个时候 handler  就是一个事件,然后有一个名字叫:委托链。你现在就可以把一个一个很委托类似的方法加到这里来handler。就比如你这里的电脑杂志,当电脑杂志发行的时候,只要调用 OnPubComputer 这个事件,就会自动的对那些订阅的人进行通知,很方便。

这样子吧我找了几份资料给你看看:
http://www.cnblogs.com/lovebaobao/archive/2008/12/17/1356769.html
http://zzk.cnblogs.com/s?w=%E4%BA%8B%E4%BB%B6%E5%92%8C%E5%A7%94%E6%89%98

你去看看吧!!~ --------------------编程问答-------------------- 委托可以视为一种特殊的类

事件可以视为一个类型为指定委托类的一个实例

handler(this,e) 是调用委托的方法,当handler是事件名称时就是触发事件了

PubComputerEventHandler handler = PubComputer; 其实就是将事件PubComputer的引用赋值给handler这个类别为PubComputerEventHandler的实例;

相当于 
Object a = new Object();//定义对象a
Object b = a;//将a的引用赋值给b,结果是b与a有相同的引用,从内存空间来看就是指向同一个内存空间

a相当于PubComputer
b相当于handler
Object相当于PubComputerEventHandler

至于handle(this,e)就是委托的特殊之处了,handle与一系列形如 void Method(object sender,PubEventArgs e)的方法相关联
执行handle(this,e)就是按顺序执行这些相关联的方法 --------------------编程问答-------------------- 事件和委托其实是同样的东西,都是一个特殊类的对象,只是事件在操作上有些限制,事件和委托可以互相赋值,
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,