C#复习之委托(Delegate)和事件(Event)

引言

进入项目组一段时间了,感觉对C#还是一知半解,正好老大要求复习基础知识,然后整理资料来进行复习,借着这股东风,就好好的把委托和时间又复习了下。

关于委托和事件,在.net里面简直太重要了,但是理解它也往往是个门槛,当初看它怎么都看不懂,慢慢的才明白一些。就把自己的理解写一下。

最后,再推荐一下两篇写的很好的文章,是大牛写的,百度百科上委托和事件的文章就是他写的这篇文章节选的。通俗易懂,对于理解委托和时间非常有帮助。

C# 中的委托和事件

C# 中的委托和事件(续)


一.什么是委托?

委托是寻址方法的.NET版本。在C#中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。我们无法判断这个指针实际指向什么,像参数和返回类型等项就更无从知晓了。而,blET委托完全不同,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。

上面是《C#高级编程》里面对委托的解释。算是比较官方的解释了吧,但是比较晦涩。

按照我个人理解,委托主要作用之一就是可以将一个方法作为参数传到函数中去,我当时学习的时候就很疑惑,为什么要用方法作为参数传到里面去,因为有些时候你(或者是计算机)无法提前知晓到时候用的方法或者类型。还是很难懂的话,就举个例子,我比较喜欢看武侠小说,估计程序员很多也喜欢,就拿天龙八部里面的慕容复做例子。读过过小说或者看过电视剧的同学知道,慕容复和他老爹很有名,最大的特点就是可以模拟对手的招数,以其人之道还治其人之身。OK,今天不是来跟大家讨论小说,咱们要做一个慕容复,用程序控制他,慕容复小的时候,只会一门武功。假设就是拈花指(拈花指好像是少林高级功夫,不管了,就当他是genius),下面是他的招数:

       public void Nianhuazhi()
        {
            Console.WriteLine("发出招式:拈花指");
        }
那么慕容少爷打架的时候,就会调用招数:

        public void Fight(string zs)
        {
            Nianhuazhi();
        }

这没什么问题,就会这一招没办法,就像当年的郭靖只会“亢龙有悔”,也很牛x。
OK,现在慕容复长大了,会这招数多了,如下:

        public void Nianhuazhi()
        {
            Console.WriteLine("发出招式:拈花指");
        }
        public void Xianglongzhang()
        {
            Console.WriteLine("发出招式:降龙十八掌");
        }
        public void Dalizhang()
        {
            Console.WriteLine("发出招式:大力金刚掌");
        }
打架的时候选择也多了,每次发招的时候有很多选择,咱们应该这样控制他,每次发招想用什么就把名字告诉他,他就会攻击了。

        public void Fight(string zs)
        {
            switch (zs)
            {
                case "Xianglongzhang":
                    Xianglongzhang();
                    break;
                case "Nianhuazhi":
                    Nianhuazhi();
                    break;
                case "Dalizhang":
                    Dalizhang();
                    break;
            }
        }

等等,这位可是号称天下武功无所不会的童鞋,那往后岂不是要学一门武功,加一个case吗?那也太烦了,要是学上几百种……

        public void Fight(string zs)
        {
            switch (zs)
            {
                case "Xianglongzhang":
                    Xianglongzhang();
                    break;
                case "Nianhuazhi":
                    Nianhuazhi();
                    break;
                case "Dalizhang":
                    Dalizhang();
                    break;
                    ……
                    ……
            }
        }

有没有一种办法,可以不用传名字,而是可以这样,直接将招式的方法传过去?好比
        public void Fight(某类型 招式)
        {
            招式
        } 

恩,估计你也知道了,委托千呼万唤始出来,尤抱琵琶半遮面

        public delegate void Zhaoshi();
        static void Main(string[] args)
        {
            Fight(Nianhuazhi);
        }
往后想用什么直接把函数传过去就好,怎么样,方便很多吧。这就是委托。就是一个函数的代号而已,不是什么神秘的东西







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值