C#事件的创建。

来源:互联网 发布:mac谷歌插件安装 编辑:程序博客网 时间:2024/06/07 14:44
delegate void Handler();


    class Incrementer
    {
        public event Handler CoutedADozen;


        public void DoCount()
        {
            for (int i = 1; i < 100; i++)
                if (i % 12 == 0 && CoutedADozen != null)
                    CoutedADozen();                 //每增加12个计数触发事件一件。
        }
    }


    class Dozens
    {
        public int DozensCount { private set; get; }


        public Dozens(Incrementer incrementer)
        {
            DozensCount = 0;
            incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
        }


        void IncrementDozensCount()
        {
            DozensCount++;
        }
    }


    class Program
    {
        static void Main()
        {
            Incrementer incrementer = new Incrementer();
            Dozens dozensCounter = new Dozens(incrementer);


            incrementer.DoCount();
            Console.WriteLine("Number of dozens={0}",
                dozensCounter.DozensCount);
        }

    }

输出结果为:

Number of dozens = 8


        标准事件的用法:

        关于标准事件的用法需要注意以下几点:

□ 第一个参数用来保存触发事件的对象的引用。由于object类型的,所以可以匹配任何类型的实例;

            □ 第二个参数用来保存状态信息,指明什么类型适用于该应用程序;

            □ 返回类型是void。

                public delegate void EventHandler(object sender,EventArgs e);

         EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。你可能会想,既然第二个参数用于传递数据,EventArgsl类的对象应该可以保存些类型的数据。但是,很显然,你可能错了。

□ EventArgs设计为不能传递任何数据。它用于不需要传递数据的事件处理程序——通常会被忽略。

□ 如果你希望传递数据,必须声明一个派生自EventArgs的类,使用合适的字段来保存需要传递的数据。

 尽管EventArgs类实际上并不传递数据,但它是使用EventHandler委托模式的重要部分。不管参数使用的实际类型是什么,object类和EventArgs总是基类。这样EventArgs就能提供一个对所有事件和事件处理器通用的签名,只允许两个参数,而不是各自不同的签名。

        现在对上面的委托进行修改:

delegate void Handler();


    class Incrementer
    {
        public event EventHandler CoutedADozen;


        public void DoCount()
        {
            for (int i = 1; i < 100; i++)
                if (i % 12 == 0 && CoutedADozen != null)
                    CoutedADozen(this, null);                 //每增加12个计数触发事件一件。
        }
    }


    class Dozens
    {
        public int DozensCount { private set; get; }


        public Dozens(Incrementer incrementer)
        {
            DozensCount = 0;
            incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
        }


        void IncrementDozensCount(object source, EventArgs e)
        {
            DozensCount++;
        }
    }


    class Program
    {
        static void Main()
        {
            Incrementer incrementer = new Incrementer();
            Dozens dozensCounter = new Dozens(incrementer);


            incrementer.DoCount();
            Console.WriteLine("Number of dozens = {0}",
                dozensCounter.DozensCount);
        }
    }

        通过改变上述事件,变为标准事件。输出结果与上述相同。


        通过拓展EventArgs来传递数据。

delegate void Handler();


    public class IncrementerEventArgs : EventArgs  //自定义派生子EventArgs
    {
        public int IterationCount { set; get; }
    }


    class Incrementer
    {
        public event EventHandler<IncrementerEventArgs> CoutedADozen;


        public void DoCount()
        {
            IncrementerEventArgs args = new IncrementerEventArgs();
            for (int i = 1; i < 100; i++)
            {
                if (i % 12 == 0 && CoutedADozen != null)
                {
                    args.IterationCount = i;
                    CoutedADozen(this, args);
                }
            }
        }
    }


    class Dozens
    {
        public int DozensCount { private set; get; }


        public Dozens(Incrementer incrementer)
        {
            DozensCount = 0;
            incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
        }


        void IncrementDozensCount(object source, IncrementerEventArgs e)
        {
            Console.WriteLine("Incremented at iteration: {0} in {1}",
                e.IterationCount, source.ToString());


            DozensCount++;
        }
    }


    class Program
    {
        static void Main()
        {
            Incrementer incrementer = new Incrementer();
            Dozens dozensCounter = new Dozens(incrementer);


            incrementer.DoCount();
            Console.WriteLine("Number of dozens = {0}",
                dozensCounter.DozensCount);
            Console.Read();
        }
    }


这段程序产生如下输出,展示了被调用时的迭代和源对象的完全限定类名。



移除事件处理程序

class Pulisher
    {
        public event EventHandler SimpleEvent;
        public void RasieTheEvent()
        {
            SimpleEvent(this, null);
        }
    }


    class Subscriber
    {
        public void MethodA(object o, EventArgs e) { Console.WriteLine("AAA"); }
        public void MethodB(object o, EventArgs e) { Console.WriteLine("BBB"); }
    }


    class Program
    {
        static void Main()
        {
            Pulisher p = new Pulisher();
            Subscriber s = new Subscriber();


            p.SimpleEvent += s.MethodA;
            p.SimpleEvent += s.MethodB;
            p.RasieTheEvent();


            Console.WriteLine("\r\nRemove MethodB");
            p.SimpleEvent -= s.MethodB;
            p.RasieTheEvent();
        }
    }

输出的结果为:


0 0