C#中委托的理解

1.定义

 委托顾名思义,就是中间人、代理人的意思。通俗地说,委托是一个可以引用方法的对象,即是说委托可以调用它所指向的方法。

2.C#中使用委托的具体的步骤

(1)声明一个委托,其参数形式一定要和想要包含的方法的参数形式一致。
(2)定义所有你要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。
(3)创建委托对象并将所希望的方法包含在该委托对象中。
(4) 通过委托对象调用包含在其中的各个方法。
步骤1: 声明一个委托

[修饰符]delegate 返回类型  委托名(参数列表);

步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必须相同。

 class MyClass1
  {
      public void dMethod1(string input)
      {
          Console.WriteLine("Method1传递的参数是 { 0}", input);
      }
      public void dMethod2(string input)
      {
          Console.WriteLine("Method2传递的参数是 { 0}", input);
      }
  }

步骤3:创建一个委托对象并将上面的方法包含其中

MyClass1 c2=new MyClass1(); 
MyDelegate1 d1 = new MyDelegate1(c2.dMethod1); 
//或者直接写成  MyDelegate1 d1 =c2.dMethod1;

步骤4:通过委托对象调用包含在其中的方法。

d1("abc");//Method1传递的参数是 abc

3.多播

委托是可以合并的,又称为多播(Multicast)。合并的委托实际上是对多个方法的调用。对于多个相同类型的委托,可以用加号运算符“+”进行调用列表的合并,可以用减号运算符“-”移除其调用列表中的方法。委托加减运算后的结果,如果其中不包含方法,则结果为null。
 MyClass1 c2 = new MyClass1();
 MyDelegate1 d1 =c2.dMethod1;
 d1 += c2.dMethod2;
 d1("abc");
 //Method1传递的参数是 abc
 //Method2传递的参数是 abc 
 d1-= c2.dMethod2;
 Console.WriteLine(d1)
 //ConsoleApp1.MyDelegate1
 d1 -= c2.dMethod1;
 Console.WriteLine(d1);
 //(输出空)

4.如何理解委托

将委托想象成点菜:
顾客去饭店吃饭肯定是不需要自己做菜的,只需要点菜和提需求。真正做菜的是厨师。那么这就存在顾客委托厨师做菜的步骤了。
步骤1: 声明一个委托
(饭店定一个委托机制,顾客根据委托机制进行点菜)

//声明一个点菜的委托(order),点菜时只需要传入基本需求(demand)
//此点菜系统,只允许顾客提一个需求,也就是只能传递一个参数(string demand)
public delegate void order( string demand);

步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必须相同。
(厨师的菜单库,里面炒菜的要求要和饭店的点菜委托机制保持一致。真正做菜的)

 //创建厨师类,里面显示厨师会炒的菜
 class ChefClsaa//厨师
 {
    //和点菜系统保持一致,也只接受顾客提一个需求(string input)
     public void friedTomato(string input)
     {
         Console.WriteLine("{0}的炒西红柿", input);
     }
     public void friedPotato(string input)
     {
         Console.WriteLine(" {0}的炒土豆", input);
     }
 }

步骤3:创建一个委托对象并将上面的方法包含其中
(根据点菜的委托机制,顾客开始向厨师点菜)

//customer表示实际需要使用委托的对象,比如正在点菜的你;
//此时你需要在厨师的菜单库中选择只能提一个需求的菜品
ChefClsaa chef= new ChefClsaa();
order customer = chef.friedTomato;//告诉厨师你要吃炒西红柿

步骤4:通过委托对象调用包含在其中的方法。
(根据点菜的委托机制,提出需求,告诉厨师开始做菜)

//现在点好菜了,提出菜品需求,让厨师开始做菜。
customer("少盐");//少盐的炒西红柿

多播的理解

//告诉厨师你还想吃炒土豆
customer += chef.friedPotato;
//告诉厨师你又不想吃西红柿了
customer -= chef.friedTomato;
customer("少盐");// 少盐的炒土豆

点菜的完整代码:

//声明一个点菜的委托(order),点菜时只需要传入基本需求(demand)
//此点菜系统,只允许顾客提一个需求,也就是只能传递一个参数(string demand)
public delegate void order( string demand);
class ChefClsaa//厨师
{
 //和点菜系统保持一致,也只接受顾客提一个需求(string input)
    public void friedTomato(string input)
    {
        Console.WriteLine("{0}的炒西红柿", input);
    }
    public void friedPotato(string input)
    {
        Console.WriteLine(" {0}的炒土豆", input);
    }
}


class Test
{
    static void Main(string[] args)
    {
        ChefClsaa chef= new ChefClsaa();
        //customer表示实际需要使用委托的对象,比如正在点菜的你;
        //此时你找到了厨师,需要在厨师的菜单库中选择只能提一个需求的菜品
        order customer = chef.friedTomato;
        //告诉厨师你还想吃炒土豆
        customer += chef.friedPotato;
        //告诉厨师你又不想吃西红柿了
        customer -= chef.friedTomato;
        //现在点好菜了,提出菜品需求,让厨师开始做菜。
        customer("少盐");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值