C#中委托和事件的对比例子

29 篇文章 0 订阅
24 篇文章 1 订阅

一:利用委托实现的例子:

    //定义一个委托类型
    public delegate void DoSthDelegate1();

    /// <summary>
    ///  苹果mp3播放器
    /// </summary>
    class iPod
    {

        //在iPod类中定义一个委托变量
        public DoSthDelegate1 userDo;

        public void PlayMusic()
        {
            Console.WriteLine("开始播放音乐.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
            if (userDo != null)
            {
                //当一开始播放音乐就触发userDo()这个动作。  调用委托变量   而委托变量的具体赋值是在主程序中
                userDo();
            }
            Console.WriteLine("开始播放音乐.....#########################.........");
        }


        public void Stop()
        {
            Console.WriteLine("停止播放.");
            //userDo();
        }

        public void Next()
        {
            Console.WriteLine("播放下一首...");
        }
    }
主程序:

static void Main(string[] args)
        {

            #region 通过委托来实现的

            iPod pod = new iPod();
            pod.userDo = BlinkBackground;

            //调用音乐开始播放的方法。
            pod.PlayMusic();


            //可以随意将之前用户已经绑定的方法给覆盖掉。
            //pod.userDo = ShowLrc;

            //明明没有播放音乐,却可以触发userDo。  这里就是冒充了发生  因此引入了事件
            //pod.userDo();   
            #endregion   

 	static void ShowLrc()
        {
            Console.WriteLine("今天是个好日子,.今天是个好日子,今天是个好日子,今天是个好日子,.........");
        }

        static void BlinkBackground()
        {
            Console.WriteLine("闪闪闪.....");
        }
	
	}


二:通过事件来实现

    //定义一个委托。
    public delegate void DoSthDelegate2();

    class iPod2
    {
        //定义了一个事件。
        //<strong>定义事件的时候必须通过委托,没有委托就无法定义事件。</strong>
        public event DoSthDelegate2 MusicPlaying;

        public void PlayMusic()
        {
            Console.WriteLine("开始播放音乐.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
            if (MusicPlaying != null)
            {
                //依然是在音乐开始播放的时候触发了该动作。  调用事件变量
                MusicPlaying();
            }
            Console.WriteLine("开始播放音乐.....#########################.........");
        }


        public void Stop()
        {
            Console.WriteLine("停止播放.");

        }

        public void Next()
        {
            Console.WriteLine("播放下一首...");
        }
    }
主程序:

static void Main(string[] args)
        {

            #region 通过事件来实现的效果

            iPod2 pod2 = new iPod2();

            //事件不能用=直接赋值,也就避免了通过=将前面的所有内容直接覆盖掉。
            pod2.MusicPlaying += new DoSthDelegate2(BlinkBackground);


            pod2.PlayMusic();

            //事件不能再类外部触发,只能在类内部触发
            //避免了向委托一样,在外部冒充事件触发。  这样直接调用是不可能的
            // pod2.MusicPlaying();

            pod2.MusicPlaying += new DoSthDelegate2(pod2_MusicPlaying);   //添加事件
            pod2.MusicPlaying -= pod2_MusicPlaying;<span style="white-space:pre">			</span>//删除事件
            #endregion

            Console.ReadKey();
        }

        static void pod2_MusicPlaying()
        {
            throw new NotImplementedException();
        }

        static void ShowLrc()
        {
            Console.WriteLine("今天是个好日子,.今天是个好日子,今天是个好日子,今天是个好日子,.........");
        }


        static void BlinkBackground()
        {
            Console.WriteLine("闪闪闪.....");
        }
    }

总结:

1.“委托”是一种数据类型,他可以存储的是方法。

2.“事件”是一个对象,可以理解为对委托变量的封装,事件的内部用的是委托实现的。

3.事件被编译成为一个add_method()和remove_method()方法和一个私有的委托变量。

4.定义的事件变量不可以在所定义类的外部调用,防止了再外部冒充事件的触发。

5.委托的作用其实是用来占位的,使用一个委托变量来代替方法的调用,在实际调用之前需要给委托变量赋值,否则为null。

6.事件的作用与委托一样,只是在功能上比委托变量有更多的限制。


C#中的委托方法可以是静态的也可以是非静态的

静态的方法用Static关键字修饰  可以在调用时直接使用方法名作为参数传递

非静态方法则需要实例化对象,通过对象调用该方法作为参数传递。  如果委托调用一个或者多个实例方法,则此属性返回调用列表中最后一个实例方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值