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)我们定义的委托类型其实和stringint类型有些思想是相同的。他们要修饰变量,类型本身要符合所要修饰变量的一些属性,这样的话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 MakeGreetingGreetingDelegate是作为一个类型而存在的,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、总结:  

        用委托真的很灵活,在你需要的时候引入它,在你不要的时候去掉它。这就是我对委托浅显的理解,还请给位大牛指导。                                                                                                                                                                                                                                                                                          

       

0 0
原创粉丝点击