博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
委托与事件(浅度分析)—委托
阅读量:1870 次
发布时间:2019-04-26

本文共 3133 字,大约阅读时间需要 10 分钟。

前言

对于委托和事件,初次接触是在《大话设计模式》这本书中,但是里面只是说明了一下委托和事件是如何使用的,并没有详细的讲解委托和事件是什么,所以不甚理解。因为不清楚委托和事件,所以每次想到它心里就很不舒服,总有一个解不开的结。现在对于它们稍微理解了一点儿,心里的石头也可以暂时放一放了。

委托由来

先说一下我自己对于委托的理解:委托的作用就是可以把方法当做参数一样使用。从而可以避免大量使用判断语句,也使程序具有更好的扩展性。可能看完上面的话,不知道什么意思,接下来就一步步分析。

1.先来看一个例子:

//打招呼public void GreetPeople(string name){    ChineseGreeting(name);}//中国人打招呼public void ChineseGreeting(string name){    Console.WriteLine("你好," + name);}

上面的语句很容易理解吧,用汉语打招呼可能有的外国人听不懂,那怎么办呢?再增加一个英国人打招呼的方法呗。

public void EnglishGreeting(string name){    Console.WriteLine("Hello," + name);}

那么,相应的 GreetPeople 方法也要更改,否则怎么知道应该用哪种方法向别人打招呼呢?当然为了输入的正确性,可以再用一个枚举将这两种语言封装起来。

public enum Language{    English,    Chinese}public void GreetPeople(string name, Language lang){    swith(lang)    {        case Language.English:            EnglishGreeting(name);            break;        case Language.Chinese:            ChineseGreeting(name);            break;    }}

虽然上面的问题解决了,可是如果需要再增加日本人,韩国人的打招呼的方法呢?还得再修改 GreetPeople 的方法,这样就违背了“开闭原则”,不利于程序的扩展。

  2.接下来,问题又来了:既然不想违背“开闭原则”,有没有一种解决办法呢?可不可以直接把方法当做参数传进 GreetPeople 方法里,然后直接调用传进去的方法,这样就避免了选择,添加其他打招呼的方法时也不需要更改 GreetPeople 方法了。用伪代码举一个示例:

public GreetPeople(一种类型  方法){    //直接调用方法就可以了,无需判断    方法(name);}

  答案就是:当然有!接下来就是委托登场了。没错,上面的一种类型指的就是委托类型。所以说委托只是一种类型,只不过略微特殊一点,它是把方法当做参数。

委托的作用

大家都知道,方法不可能全写在一个类中,一般方法都会分布在不同的类中,那如果想跨类调用方法,应该怎么办呢?有的人说利用多态就可以啊。很正确,利用多态是可以实现,但是前提是还得继承父类或实现接口。而委托无需这样,就可以跨类调用。接下来,对比一下:

//利用多态实现public interface IGreeting{    void GreetingPeople(string name);}public class EnglishGreeting : IGreeting{    public void GreetingPeople(string name)    {        Console.WriteLine("Hello," + name);    }}public class ChieseGreeting : IGreeting{    public void GreetingPeople(string name)    {        Console.WriteLine("你好," + name);    }}class Program{    private static void GreetPeople(string name,IGreeting makeGreeting)    {        makeGreeting.GreetingPeople(name);    }    static void Main(string[] args)    {        GreetPeople("Vijay",new EnglishGreeting());        GreetPeople("张伟杰",new ChieseGreeting());        Console.Read();    }}
//利用委托实现public delegete void GreetingDelegate(stirng name);class Program{    private static void GreetPeople(string name,GreetingDelegate makeGreeting)    {        makeGreeting(name);    }    static void Main(string[] args)    {        GreetPeople("Vijay",EnglishGreeting);        GreetPeople("张伟杰",ChieseGreeting);        Console.Read();    }}

通过比较可以发现,利用多态,还需要定义接口或者继承父类,而且在调用的时候还需要实例化。而利用委托,直接将方法名传递就可以。

委托的绑定

那么委托的绑定过程又是怎么样呢?先不管它,先来想一个问题:既然委托是一种类型,可不可以像普通类型那样进行赋值呢?比如:string name = “vijay”;

static void Main(string[] args){    GreetingDelegate delegate1;    delegate1 = EnglishGreeting;     //向委托变量赋值    delegate1 += ChineseGreeting;    //等于是将第二个方法存到一个链表中    //将依次调用 EnglishGreeting 和 ChineseGreeting 方法    delegate1("Vijay");    Console.Read();}

这样也是可以的,但是注意第一次用到是赋值“=”,第二次用的是“+=”。如果第一次也用“+=”就会出现“使用了未赋值的局部变量”的编译错误。

其实 delegate1 = EnglishGreeting;是下面这样的:

GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);

我认为给委托绑定方法其实就是将方法赋给一个委托类型的变量。只不过不同于其他的普通类型,委托可以有多个赋值,即可以绑定多个方法。

小结

委托是什么?委托只不过是一种类型,也没有多么的高大上,可以将方法赋给它的一种类型,暂时可以这么通俗的理解。一般来说,有委托就有事件,委托和事件是配合使用的,下一篇博客就说明一下事件是什么。

转载地址:http://wbeff.baihongyu.com/

你可能感兴趣的文章
自我学习39:接口自动化测试用例&功能测试用例区别
查看>>
mirror去兔子补丁下载 附安装教程
查看>>
mirror去兔子补丁 v3.0附安装教程
查看>>
mirror去兔子补丁为什么还有兔子_mirror去兔子补丁使用教程
查看>>
3dmax2012安装教程
查看>>
OC渲染器(Octane Render)整合版安装包 附安装教程
查看>>
操作系统期末大题复习
查看>>
hive:分区表,hbase外表
查看>>
想要成为运维,想要成为后期的架构师?这些知识是必备的!
查看>>
linux 是如何 快速一键安装禅道的呐?
查看>>
运维面试基础试题(四)
查看>>
一键安装Openstack单节点 必能成功
查看>>
面试紧张怎么办
查看>>
关系型数据库 ,nosql数据库简介
查看>>
Centos 7搭建NTP时间同步服务器
查看>>
centos7 基于rsync+inotify 实现定时备份
查看>>
指定IP进行 文件的分发
查看>>
基于http搭建本地yum仓库
查看>>
常规邮件基础
查看>>
邮件基础之 -- SMTP协议
查看>>