每天进步一点--c#基础巩固,事件、委托

      要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子,搞懂这些概念,我写文章也是出于这个目的,希望和大家一块学习进步。

      我还是拿经典的例子来说明:猫叫,老鼠跑,主人吵醒了。

      我们用事件的方法来实现,把猫叫作为触发事件的方法,绑定在这个事件上的方法都会被触发。

先用网上大家的例子:

    public class Cat
    {
        /// <summary>
        /// 猫叫方法    
        /// </summary>
        public void Miao()
        {
            Console.WriteLine("喵喵喵喵喵喵");
            if (OnMiao != null)
                OnMiao(this,EventArgs.Empty);
        }
        /// <summary>
        /// 猫叫事件
        /// </summary>
        public event EventHandler OnMiao;
    }

  

 public class Master
    {
        public Master()
        {
        }
        /// <summary>
        /// 主人被叫醒了
        /// </summary>
        public void Wake()
        {
            Console.WriteLine("死猫叫啥叫,吵我睡觉!!!");
        }
    }

  

public class Mouse
    {
        public Mouse()
        {
        }
        /// <summary>
        /// 老鼠跑
        /// </summary>
        public void Run()
        {
            Console.WriteLine("猫来了,快跑!!!!");
        }
    }

  客户端代码

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse = new Mouse();
            Master master = new Master();

            cat.OnMiao += delegate { mouse.Run(); };
            cat.OnMiao += delegate { master.Wake(); };

            cat.Miao();
        }

    }

  这个办法可以实现,猫叫,老鼠跑,主人醒。但如果我想拓展下呢,主人叫有好几只猫,每只猫叫的声音都不一样,主人吵醒后要知道哪只猫把他吵醒了。

现在我们改写Cat类

/// <summary>
    /// 我们自定义事件数据
    /// </summary>
    public class CatEventArgs : EventArgs
    {
        public string CatName { get; set; }
    }
    public class Cat
    {
        /// <summary>
        /// 定义事件委托
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public delegate void CatEventHandler(object sender, CatEventArgs e);
        public Cat()
        {
        }
        /// <summary>
        /// 猫叫
        /// </summary>
        public void Miao()
        {
            Console.WriteLine("喵喵喵喵喵喵");
            if (OnMiao != null)
            {
                CatEventArgs catEventArgs = new CatEventArgs();
                catEventArgs.CatName = "Tom";
                OnMiao(this, catEventArgs);
            }
        }
        /// <summary>
        /// 猫叫完成事件
        /// </summary>
        public event CatEventHandler OnMiao;
    }

  客户端代码

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse = new Mouse();
            Master master = new Master();

            cat.OnMiao += cat_OnMiao;
            cat.OnMiao += delegate { master.Wake(); };

            cat.Miao();
        }

        static void cat_OnMiao(object sender, CatEventArgs e)
        {
            Console.WriteLine(string.Format("{0}猫在叫",e.CatName));
        }
    }

  这样就知道哪只猫叫了,关键是我们自定义了CatEventArgs,这个类继承了EventArgs,可以传递事件信息,自定义信息,并且自定义事件委托public delegate void CatEventHandler(object sender, CatEventArgs e);

自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一层楼

                                                                                                                                                                                                  --每天有点进步

posted @ 2014-02-10 14:13  小菜?大神?  阅读(1056)  评论(3编辑  收藏  举报