C#委托
来源:互联网 发布:上海好的java培训机构 编辑:程序博客网 时间:2024/05/01 07:55
1、一个例子引发我们的思考:
<span style="font-family:Courier New;font-size:18px;"><span style="font-family:Microsoft YaHei;">using System;usingSystem.Collections.Generic;usingSystem.Text;namespaceDelegate{class Program{//如果此人英国人,英文问候,public void EnglishGreeting(string name){Console.WriteLine("Morning, " + name);}//如果此人中国人,汉语问候,public void ChineseGreeting(string name){Console.WriteLine("早上好, " +name);}//枚举,标识有哪几种语言。public enum Language{English, Chinese} //客户通过此方法,访问。public void GreetPeople(string name, Language lang){//做某些额外的事情,比如初始化之类,此处略switch(lang){case Language.English:EnglishGreeting(name);break;case Language.Chinese:ChineseGreeting(name);break;}} static void Main(string[] args){GreetPeople("张子阳",Chinese);Console.ReadKey();}}}</span></span>
结果:
早上好,张子阳
从上一个例子就可以知道,调用GreetPeople(“张子阳,Chinese),通过case语句就可以选择执ChineseGreeting(“张子阳”)。GreetPeople(stringname,Language lang)中的lang参数的参数,其实就是为了找到对应的方法。为了辨别那种语言,我们通过枚举把各个语言都列出,再通过GreetPeople()中case语句选择匹配客户的方法。不管我们用枚举也好,用case也罢,我们的目的就是找到我们要执行的方法。大家是不是会问,我们能不能直接把我们要那个方法传过去,这样的话就不会(有枚举,不会有case)省去很多繁琐的过程,可谓一步到位。再看GreetPeople(string name, Language lang)此方法定义的时候,都是类型
+变量。那么现在我们想把我们的方法作为变量传过去可行吗?那么它的类型又是什么呢?
2、引入委托
上面的疑问能解决吗,即下面的方法可以被实现吗?
public voidGreetPeople(string name, *** MakeGreeting)
{
MakeGreeting(name);
}
接下来就拿上面的例子引入委托:
Publicdelegate void GreetingDelegate(string name);
需要说明两点
1)定义方法的类型,我们叫它委托。
2)我们定义的委托类型其实和string或int类型有些思想是相同的。他们要修饰变量,类型本身要符合所要修饰变量的一些属性,这样的话string类型的数据才可以放入string定义的空间中,int类型的数据放入int定义的空间内。委托也是一样的,我们也可以把也是一种修饰类型,开辟此种方法的空间,那么它一定要适应它修饰方法的一些属性,这样的话才能有做到修饰方法的资格。
下面的方法返回类型为void,参数类型为string.
<span style="font-family:Courier New;font-size:18px;"><span style="font-family:Microsoft YaHei;"> public voidEnglishGreeting(string name){Console.WriteLine("Morning, " + name);}//如果此人中国人,汉语问候,public void ChineseGreeting(string name){Console.WriteLine("早上好, " +name);}</span></span>
定义此方法的委托,该委托也要符合所修饰方法的返回类型void和参数类型string,的这些属性。这样的委托,对于修饰的方法来说才有意义,得到上面方法的委托是:
Public delegate void GreetingDelegate(string name),GreetingDelegate是此方法的修饰类型。
类型得到了,那么就可以解决传参的问题:
public voidGreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
应用委托:
<span style="font-family:Courier New;font-size:18px;"><span style="font-family:Microsoft YaHei;">static voidMain(string[] args) {string name1, name2;name1 = "Jimmy Zhang";name2 = "张子阳";GreetPeople(name1, EnglishGreeting);GreetPeople(name2, ChineseGreeting);Console.ReadKey();}</span></span>
结果:
早上好,张子阳
GreetingDelegate MakeGreeting,GreetingDelegate是作为一个类型而存在的,MakeGreeting变量通过赋值也可以得到,如下:
<span style="font-family:Courier New;font-size:18px;"><span style="font-family:Microsoft YaHei;">static voidMain(string[] args) {GreetingDelegatedelegate1;delegate1 =EnglishGreeting; // 先给委托类型的变量赋值delegate1 +=ChineseGreeting; // 给此委托变量再绑定一个方法// 将先后调用 EnglishGreeting 与 ChineseGreeting方法delegate1("Jimmy Zhang");Console.ReadKey();}</span></span>
结果:
Morning, JimmyZhang
早上好, Jimmy Zhang
委托类型的变量可以赋一个值,它可以继续追加一个值。但是需要注意的是第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。也可以用下面的形式:
GreetingDelegatedelegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 +=ChineseGreeting; //绑定多个方法,按顺序执行。
delegate1 -= EnglishGreeting; //取消对EnglishGreeting方法的绑定
3、总结:
用委托真的很灵活,在你需要的时候引入它,在你不要的时候去掉它。这就是我对委托浅显的理解,还请给位大牛指导。
- C#委托-委托概述
- C#委托
- C#委托
- C#委托
- c#委托
- C# 委托
- C#委托
- C# 委托
- c#委托
- C#委托
- c#委托
- C#委托
- C# - 委托
- C#委托
- C#委托
- C#委托
- C# 委托
- c#委托
- sql server 通配符
- 利用NIO构造简单的聊天功能
- LwIP源码分析2-ARP
- 创建型模式之工厂方法模式(FactoryMethod)
- 一道面试算法题
- C#委托
- android引入unity-classes.jar之后进行混淆的问题解决
- DPM目标检测算法(毕业论文节选)
- 分布式Ruby解决之道
- 实例演示oracle数据块状态视图v$bh的用法一 获取oracle对象所占用的数据块
- Python学习记录(一)
- 图解SQL inner join、left join、right join、full outer join、union、union all的区别
- mapreduce中实现对hbase中表数据的添加
- javascript的call和apply