C#委托

         

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
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值