Delegate类简介 ------------------------ 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一种数据结构,通过它可引用或引用类实例及该类的实例方法。 以往的界面编程中我们应该都接触过各种类型的(event driven)的处理模式, 在这种模式里,我们定义相应事件触发的函数。 例如: Button1 的 Click事件,我们可以编写Button1_Click 或 Btn1Clicked等函数来做相应的驱动处理。 而事件与驱动函数的对应关系就是通过委托(Delegate)类来关联的。 其实委托(Delegate)类这种数据结构有些类似于之前++中的。 Delegate类一个简单应用 ------------------------ 1.定义一个Delegate函数数据结构 2.定义Delegate将引用的或引用类实例及该类的实例方法 3.Delegate数据变量指向实例方法 4.通过Delegate数据变量执行实例方法 A very basic example (TestClass.cs):
1 using System; 2 3 namespace MySample 4 { 5 class TestClass 6 { 7 //1.定义一个Delegate函数数据结构 8 public delegate void GoDelegate(); 9 10 [STAThread]11 static void Main(string[] args)12 {13 //3.Delegate数据变量指向实例方法14 GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);15 16 //4.通过Delegate数据变量执行实例方法17 goDelegate();18 return;19 }20 21 //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法22 public static void MyDelegateFunc()23 {24 Console.WriteLine("delegate function...");25 } 26 }27 }
编译执行结果: # TestClass.exe delegate function... 使用Delegate类和Override实现的比较 ----------------------------------------------- 1.使用Delegate类的时候,下面的例子可以很清楚的说明。 1.1 首先定义一个动物(MyAnimalDelegateClass), 中有显示属性的(ShowAnimalType)的public方法。 并且在ShowAnimalType方法中调用Delegate引用的实例方法 1.2 定义狮子(LionDelegateClass)和马(HorseDelegateClass)两个子类。Delegate与各自的实例方法绑定 实现不同的属性显示(ShowAnimalType)方法。 Delegate example (TestClass.cs):
1 using System; 2 namespace MySample 3 { 4 class TestClass 5 { 6 [STAThread] 7 static void Main(string[] args) 8 { 9 //狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用10 LionDelegateClass lionDelegate = new LionDelegateClass();11 lionDelegate.ShowAnimalType("MySample");12 13 //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用14 HorseDelegateClass horseDelegate = new HorseDelegateClass();15 horseDelegate.ShowAnimalType("MySample");16 }17 }18 19 //动物基类(MyAnimalDelegateClass)20 public class MyAnimalDelegateClass21 {22 //Delegate数据结构定义23 public delegate void DelegateFunction(string strFuncName);24 25 private DelegateFunction m_delegateFunction = null;26 27 //Delegate类型的属性28 public DelegateFunction delegateFunction 29 {30 get 31 {32 return m_delegateFunction;33 } 34 set 35 {36 m_delegateFunction = value;37 }38 }39 40 //属性显示(ShowAnimalType)方法41 public void ShowAnimalType(string strFuncName)42 {43 if (delegateFunction != null)44 {45 object[] args = {strFuncName};46 //调用Delegate引用的实例方法47 delegateFunction.DynamicInvoke(args);48 }49 }50 }51 52 //狮子(LionDelegateClass)53 public class LionDelegateClass:MyAnimalDelegateClass54 {55 public LionDelegateClass()56 {57 this.delegateFunction = new DelegateFunction(subFunction1);58 }59 60 //狮子(LionDelegateClass)实例方法的实装61 private void subFunction1(string strFuncName)62 {63 System.Console.WriteLine(64 string.Format("[{0}]This is a lion....", strFuncName));65 }66 }67 68 //马(HorseDelegateClass)69 public class HorseDelegateClass:MyAnimalDelegateClass70 {71 public HorseDelegateClass()72 {73 this.delegateFunction = new DelegateFunction(subFunction2);74 }75 76 //马(HorseDelegateClass)实例方法的实装77 private void subFunction2(string strFuncName)78 {79 System.Console.WriteLine(80 string.Format("[{0}]This is a horse....", strFuncName));81 }82 }83 }
编译执行结果: # TestClass.exe [MySample]This is a lion.... [MySample]This is a horse.... 2.使用Override实装的时候,参考下面的例子。 1.1 首先定义一个动物基类(AbstractAnimalNoDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。 并且在ShowAnimalType方法中调用抽象方法(NoDelegateFunction) 1.2 定义狮子(LionNoDelegateClass)和马(HorseNoDelegateClass)两个子类。 子类中实装抽象方法(NoDelegateFunction) 实现不同的属性显示(ShowAnimalType)方法。 Override example (TestClass.cs):
1 using System; 2 namespace MySample 3 { 4 class TestClass 5 { 6 [STAThread] 7 static void Main(string[] args) 8 { 9 //狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用10 LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();11 lionNoDelegate.ShowAnimalType("MySample");12 13 //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用14 HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();15 horseNoDelegate.ShowAnimalType("MySample");16 }17 }18 19 //动物基类(AbstractAnimalNoDelegateClass)20 public abstract class AbstractAnimalNoDelegateClass21 {22 public void ShowAnimalType(string strFuncName)23 {24 //抽象方法(NoDelegateFunction)调用25 NoDelegateFunction(strFuncName);26 }27 //在基类中定义抽象方法(NoDelegateFunction)28 protected abstract void NoDelegateFunction(string strFuncName);29 }30 31 //狮子(LionNoDelegateClass )32 public class LionNoDelegateClass:AbstractAnimalNoDelegateClass33 {34 // 子类中实装抽象方法(NoDelegateFunction)35 protected override void NoDelegateFunction(string strFuncName)36 {37 System.Console.WriteLine(38 string.Format("[{0}]This is a lion....", strFuncName));39 }40 }41 42 //马(HorseNoDelegateClass )43 public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass44 {45 // 子类中实装抽象方法(NoDelegateFunction)46 protected override void NoDelegateFunction(string strFuncName)47 {48 System.Console.WriteLine(49 string.Format("[{0}]This is a horse....", strFuncName));50 }51 }52 }
编译执行结果:
# TestClass.exe [MySample]This is a lion.... [MySample]This is a horse.... 3.比较Delegate和Override实装方式 可以看出Delegate实装方式中,相当于定义一个的。 通过把实装函数的地址赋给该,实现同样的方法,处理方式的不同。 而Override方式中,则是在父类中预先定义好接口,通过实装的不同, 来实现同样的方法,处理方式的不同。 Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。 Override方式封装性好,相对比较安全。 MulticastDelegate 类的应用 --------------------------------- 在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数, 并且可以按照委托的先后顺序,执行相应的函数。 如下例:
1 using System; 2 namespace MySample 3 { 4 class TestClass 5 { 6 [STAThread] 7 static void Main(string[] args) 8 { 9 DogDelegateClass dogDelegate = new DogDelegateClass();10 dogDelegate.ShowAnimalType("MySample");11 12 }13 14 public class MyAnimalDelegateClass15 {16 public delegate void DelegateFunction(string strFuncName);17 18 private DelegateFunction m_delegateFunction = null;19 20 public DelegateFunction delegateFunction 21 {22 get 23 {24 return m_delegateFunction;25 } 26 set 27 {28 m_delegateFunction = value;29 }30 }31 32 public void ShowAnimalType(string strFuncName)33 {34 if (delegateFunction != null)35 {36 object[] args = {strFuncName};37 38 delegateFunction.DynamicInvoke(args);39 }40 }41 }42 43 public class DogDelegateClass:MyAnimalDelegateClass44 {45 public DogDelegateClass()46 {47 //多路委托函数 设定48 this.delegateFunction = new DelegateFunction(subFunction31);49 this.delegateFunction += new DelegateFunction(subFunction32);50 }51 //委托函数152 private void subFunction31(string strFuncName)53 {54 System.Console.WriteLine(55 string.Format("[{0}]This is a dog....", strFuncName));56 }57 //委托函数258 private void subFunction32(string strFuncName)59 {60 System.Console.WriteLine(61 string.Format("[{0}]This is a nice dog....", strFuncName));62 }63 }64 }
编译执行结果:
# TestClass.exe [MySample]This is a dog.... [MySample]This is a nice dog....