委托与事件的区别

委托与事件的区别

`



前言

事件(event)基于委托,
为委托提供了一个发布/订阅机制,
我们可以说事件是一种具有特殊签名的委托。


一、通过三种形式来展示事件和委托的区别

  1. 既没有使用事件也没有使用委托
  2. 使用委托
  3. 使用事件

二、案列演示

1.一般形式

代码如下(示例):

例一方法的弊端在于:
若老鼠数量增加时,我们需要更改Cat类中的CatComing方法
1.添加形式参数(我们若想要在Cat类中的CatComing方法中使用Mouse类的方法我们需要加入形式参数)
2.添加方法mousex.Runaway()

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

        }

        public void CatComing(Mouse mouse1,Mouse mouse2)
        {
            Console.WriteLine("猫来了");
            mouse1.Runaway();
            mouse2.Runaway();
            
        }


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

        }
        public void Runaway()
        {
            Console.WriteLine(name + "开始跑了");

        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("加菲猫", "yellow");
            Mouse mouse1 = new Mouse("米奇", "red");
            Mouse mouse2 = new Mouse("米二", "green");
            Mouse mouse3 = new Mouse("米三", "black");
            cat.CatComing();
            Console.ReadKey();
        }
    }

2.使用委托进行优化

代码如下(示例):

  • 在Cat类中CatComing方法里我们需先判断委托是否为null再进行执行
  • 在Program类中委托是通过注册的方式+= or-= 且注册加入方法名不含()
  • 相比上一个方式 委托让我们不再需要每添加一只猫就需要改变Cat类中的方法
  • 不足在于:每次添加猫仍需要注册方法加入委托
class Mouse
    {
        private string name;
        private string color;
        public Mouse(string name,string color)
        {
            this.name = name;
            this.color = color;

        }
        public void Runaway()
        {
            Console.WriteLine(name + "开始跑了");

        }
    }
 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("猫来了");
            if (CatCome != null)
                CatCome();
            
        }

        public Action CatCome;
    }
class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("加菲猫", "yellow");
            Mouse mouse1 = new Mouse("米奇", "red");
            cat.CatCome += mouse1.Runaway;
            Mouse mouse2 = new Mouse("米二", "green");
            cat.CatCome += mouse2.Runaway;
            Mouse mouse3 = new Mouse("米三", "black");
            cat.CatCome += mouse3.Runaway;
            cat.CatComing();
            Console.ReadKey();
        }
    }

使用事件进行优化

与上例区别在于:
事件不可以在外部调用cat.CatCome()无法在主函数中调用
而委托可在外部调用 (易出错)

通过在Mouse类中对构造函数的更改,减少代码量

补充构造构造函数与主函数中的Mouse mouse1= new Mouse()相对应
构造函数内有几个参数 new mouse(对应参数)

class Mouse
    {
        private string name;
        private string color;
        public Mouse(string name,string color,Cat cat)
        {
            this.name = name;
            this.color = color;
            cat.CatCome += this.Runaway;
        }
        public void Runaway()
        {
            Console.WriteLine(name + "开始跑了");

        }
    }
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("猫来了");
            if (CatCome != null)
                CatCome();
            
        }

        public event Action CatCome;
    }
 class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("加菲猫", "yellow");
            Mouse mouse1 = new Mouse("米奇", "red",cat);
            
            Mouse mouse2 = new Mouse("米二", "green",cat);
            
            Mouse mouse3 = new Mouse("米三", "black",cat);
            
            cat.CatComing();
            Console.ReadKey();
        }
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值