对于委托的理解方式可能每个人都不尽相同,正所谓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(); }