委托,深入浅出才是王道(二)

对于委托的理解方式可能每个人都不尽相同,正所谓1000个人心中有1000个哈姆雷特!

笔者以一种较容易理解的方式太陈述,可能更适合新手,各路大神砖家们请勿喷,感激不尽!!!

回顾一下上一篇的demo代码,有一些小的改动:

View Code
 1 using System;
 2 
 3 namespace DelegateTest
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             const string ch_name = @"张三";
10             const string en_name = @"zhangsan";
11             PepoleClass pc = new PepoleClass();
12             PepoleClass.SpeakDelegate del_1 = pc.SpeakEnglish;
13             PepoleClass.SpeakDelegate del_2 = pc.SpeakChinese;
14             
15             pc.SpeakOperate(ch_name,del_1);
16             pc.SpeakOperate(en_name,del_2);
17             Console.ReadLine();
18         }
19     }
20     public class PepoleClass
21     {
22         public void SpeakChinese(string name)
23         {
24             Console.WriteLine("你好,{0}", name);
25         }
26 
27         public void SpeakEnglish(string name)
28         {
29             Console.WriteLine("Hello,{0}", name);
30         }
31         //定义委托
32         public delegate void SpeakDelegate(string name);
33         public void SpeakOperate(string name, SpeakDelegate speak_method)
34         {
35             speak_method(name);
36         }
37     }
38 }

上一篇地址http://www.cnblogs.com/error500/archive/2012/09/14/2684321.html

前面说过委托也是一个类,可以将方法当作另一个方法的参数来传递,这里没有直接传入方法名,而是定义了两个基于委托的变量,可能更好理解。其实在javascript里面也有一中类似的用法,有时候我们会将一个函数名传给第二个函数,第二个函数会根据函数名执行函数,例如:

<script type="text/javascript">
  func_handle(func_operate);
  function func_handle(func_name){
    func_name();
  }
  function func_operate(){
    alert("看我像委托吗?");
  }
</script>

言归正传,多播委托。首先要说明的一点是,多播委托相关的方法必须是void无返回值的方法。

多播委托就是可以将多个方法赋值给同一个委托,当调用这个委托的时候,将依次调用所绑定方法,语法如下:

static void Main(string[] args)
{
    const string name = @"张三";
    PepoleClass pc = new PepoleClass();
    //给委托类型的变量赋值
    //PepoleClass.SpeakDelegate del_variable = new PepoleClass.SpeakDelegate(pc.SpeakEnglish);
    PepoleClass.SpeakDelegate del_variable = pc.SpeakEnglish;
    //再给此委托绑定一个方法,取消绑定使用-=:del_variable -= pc.SpeakChinese;
//直接使用=:del_variable = pc.SpeakChinese;会覆盖前面绑定的方法
del_variable += pc.SpeakChinese; pc.SpeakOperate(name, del_variable);//先调用SpeakEnglish再调用SpeakChinese Console.ReadLine(); }

原文地址:https://www.cnblogs.com/error500/p/2685959.html