C#委托与事件

这几天小白我重新温习了siki讲的C#的委托与事件,为了防止忘记,写下此文

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法。我们叫做代码,

废话不多说,代码说话,

我们从观察者设计模式来看委托。猫捉老鼠的游戏,猫来了,老鼠就要跑,这里老鼠是观察者,猫是被观察者,当猫有(猫来了)这个动作时,这时观察者老鼠就执行(逃跑)这个动作

猫的类如下:

class Cat
    {
        private string name;
        private string color;
        public Cat(string name, string color)
        {
            this.name = name;
            this.color = color;
        }

        ///猫来了
        public void CatComing()
        {
            Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵");
            if (CatCome != null)
            {
                CatCome();   //调用委托
            }
        }
        public Action CatCome;   //声明一个猫来了的委托
    }

老鼠的类如下:

 private string name;
        private string color;
        public Mouse(string name,string color,Cat cat)
        {
            this.name = name;
            this.color = color;
        }

        public void RunAway()
        {
            Console.WriteLine(color + "的老鼠" + name + "说:猫来了,赶紧跑");
        }

main方法如下:

static void Main(string[] args)
        {
            Cat cat = new Cat("加菲猫", "黄色");
            Mouse mouse1 = new Mouse("米奇1", "黑色", cat);
cat.CatCome+=mouse1.RunAway; //向CatCome委托注册 Mouse mouse2
= new Mouse("米奇2", "白色", cat);
cat.CatCome+=mouse1.RunAway;
//向CatCome委托注册
            cat.CatComing();
Console.ReadKey();
}

运行结果如下

我们对上述代码进行优化,把注册事件放到类中,避免main()方法中太多重复的代码

 public Mouse(string name,string color,Cat cat)
        {
            this.name = name;
            this.color = color;
            cat.CatCome += this.RunAway;    //把自身的逃跑方法注册到猫的委托里
        }

这样也可实现上述功能。

而事件就是委托的一个特例

其就是在委托前面加上event关键字:

 public event Action CatCome;   //声明一个猫来了的事件

区别在于委托可以在类的外部进行调用,而事件不能在类的外部直接调用

如下代码,委托调用是正确的(不会报错)的(不建议这种做法)

Cat cat = new Cat("加菲猫", "黄色");
            Mouse mouse1 = new Mouse("米奇1", "黑色", cat);
            Mouse mouse2 = new Mouse("米奇2", "白色", cat);
            cat.CatComing();
            cat.CatCome(); 
            Console.ReadKey();

这是会显示两次结果。

而事件调用就是出错的

 Cat cat = new Cat("加菲猫", "黄色");
            Mouse mouse1 = new Mouse("米奇1", "黑色", cat);
            Mouse mouse2 = new Mouse("米奇2", "白色", cat);
            cat.CatComing();
            cat.CatCome();   这里会报错,因为事件不允许在类的外部被直接触发,只能在类的内部适时的时机触发。委托不一样,委托可以在
            //类的外部触发(但是不要轻易使用),使用中,委托常用来表达可调,事件表达外发的接口。
            Console.ReadKey();

错误反馈是这样的:

以后了解了新知识继续更本博文。

posted @ 2019-04-12 10:23  jianjipan  阅读(183)  评论(0编辑  收藏  举报