分享
 
 
 

委托学习笔记1:委托的基本使用

王朝学院·作者佚名  2016-05-20
窄屏简体版  字體: |||超大  

委托学习笔记1:委托的基本使用一、引子

在正式说委托前,我先给一个例子,然后引出后面要说的委托。

很简单,就是一个机器人打招呼的。

代码清单1.1:

class Robot { public void GreetByChinese(string name) { Console.WriteLine("你好," + name + "!"); } public void GreetByEnglish(string name) { Console.WriteLine("Hello," + name + "!"); } //打招呼 public void DoGreet(string name,string lang) { switch (lang) { case "chinese": GreetByChinese(name); break; case "english": GreetByEnglish(name); break; default: break; } } } class PRogram { static void Main(string[] args) { //实例化机器人对象 Robot robot = new Robot(); string name = Console.ReadLine(); robot.DoGreet(name,"chinese"); robot.DoGreet(name,"english"); Console.Read(); } }

View Code代码清单1.1中创建了一个机器人类,类中封装了两个打招呼的方法和一个调用这两个方法的公共方法。DoGreet方法中,只要带name和switch中的条件,就可以打印出对应语言打招呼的语句。

那么,如果我要增加其他的语言,如法语、日语、韩语等,我除了增加对应的方法,还需要改DoGreet方法里的case语句,维护量较大。那有什么办法可以解决这种尴尬呢?

一种比较简单的方法是,直接将方法作为参数(变量),传给另一个方法(DoGreet),在其中执行即可。

但我们都知道,能作为方法的参数的是某一类型的对象或变量,而方法是个什么类型呢?确实找不出方法对应的类型。但依然有种方法可以间接的将方法作为一个参数来使用,这便引出了,下面要提到的“委托”。

二、关于委托,微软给出的定义如下:

“委托用于将方法作为参数传递给其他方法。”

早在C#1.0时,就已开始支持这个特性(用过VS2003的园友,应该是最清楚不过了)。关于微软给出的定义,已经很好理解了:我们利用委托,把方法作为一个参数(变量)传递给其他的方法,从而由其他方法来代为执行这个当做参数的方法里的动作。

三、那么怎么去使用委托呢?

使用委托,基本要按照如下步骤实现:

1、定义一个委托类型

访问修饰符delegate返回类型委托类型名称(参数列表);

Ex:publicdelegatevoidGreet(stringname);

2、创建一个执行某动作的方法(返回类型和参数列表须与委托类型相同)

访问修饰符返回类型方法名称(参数列表){......}

Ex:publicvoidGreetByChinese(stringname)

{

Console.WriteLine(“你好,”+name+“!”);

}

3、实例化委托类型

委托类型名称委托对象名称=方法名称;

Ex:Greetgreet=GreetByChinese;

4、开始使用,执行操作

委托对象名称(参数列表);

或:委托对象名称.Invoke(参数列表);

Ex:greet(“季节旋风”);或:greet.Invoke(“季节旋风”);

如上,就这么个简单的流程,是不是很简单。但这里,可能有人会说,定义中不是将方法作为参数传给另一个方法吗?怎么没有这么用?其实这个不用担心,我们已经在步骤3中将方法引用给了greet对象,既然是对象,那么久可以作为方法的参数,就可以很好地解决这个疑问。

具体的看下面的代码清单3.1:

//一个常用的委托,打招呼 delegate void Greet(string name); //一个机器人类,封装打招呼 class Robot { public void GreetByChiness(string name) { Console.WriteLine("你好," + name + "!"); } public void GreetByEnglish(string name) { Console.WriteLine("Hello," + name + "!"); }public void GreetByJapaness(string name){Console.WriteLine("こんにちは," + name + "!");} //打招呼 public void DoGreet(string name, Greet greet) { greet(name); } } class SampleDelegate { static void Main(string[] args) { //实例化机器人对象 Robot robot = new Robot(); string name = Console.ReadLine(); //通过把方法作为变量来实现打招呼 robot.DoGreet(name, robot.GreetByChiness); robot.DoGreet(name, robot.GreetByEnglish);robot.DoGreet(name, robot.GreetByJapaness); Console.Read(); }}

View Code

执行结果如下:

依然是机器人大招呼的例子,但用到了委托,这样一来是不是更简洁了?这里已经可以轻松地将方法作为参数传递给执行方法(DoGreet)中,并在其中执行操作。

四、合并委托(多路广播委托)

委托对象的一个有用属性是:可以使用“+”运算符将多个对象分配给一个委托实例。多播委托包含已分配委托的列表。在调用多播委托时,它会按顺序调用列表中的委托。只能合并相同类型的委托。“-”运算符可用于从多播委托中移除组件委托。

依然用机器人打招呼的例子来讲,这里就不再使用DoGreet方法了,直接在Main方法中来做“打招呼”动作。如下(代码清单4.1):

Greet greet = robot.GreetByChiness;greet += robot.GreetByEnglish;greet += robot.GreetByJapaness;greet(name);

在运行时,它会按顺序执行调用的方法,如下图:

值得注意的是,只有对委托对象greet初始化后才可进行多播操作,例如下面的这种写法就是错误的:

Greetgreet+=robot.GreetByChiness;

在执行移除(“-”)操作时,跟合并操作类似,但它是从委托中移除已有的方法。例如将代码清单4.1的代码后面加上,下面代码(代码清单4.2):

Console.WriteLine("移除日语后:");greet -= robot.GreetByJapaness;greet(name);

那么第二次greet时,会少一个日语问候,执行结果如下图:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有