Delegate类简介

------------------------

命名空间:System

程序集:mscorlib(在 mscorlib.dll 中)

委托(Delegate)类是一种数据结构,通过它可引用静态方法或引用类实例及该类的实例方法。

以往的界面编程中我们应该都接触过各种类型的事件驱动(event driven)的处理模式,

在这种模式里,我们定义相应事件触发的函数。

例如:

Button1 的 Click事件,我们可以编写Button1_Click 或 Btn1Clicked等函数来做相应的驱动处理。

而事件与驱动函数的对应关系就是通过委托(Delegate)类来关联的。

其实委托(Delegate)类这种数据结构有些类似于之前C/C++中的函数指针。

Delegate类一个简单应用

------------------------

1.定义一个Delegate函数数据结构

2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法

3.Delegate数据变量指向实例方法

4.通过Delegate数据变量执行实例方法

  1. A very basic example (TestClass.cs):
  2.  
  3. using System;
  4.  
  5. namespace MySample
  6. {
  7.     class TestClass
  8.     {
  9.     //1.定义一个Delegate函数数据结构
  10.         public delegate void GoDelegate();
  11.  
  12.         [STAThread]
  13.         static void Main(string[] args)
  14.         {
  15.         //3.Delegate数据变量指向实例方法
  16.             GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);
  17.  
  18.         //4.通过Delegate数据变量执行实例方法
  19.             goDelegate();
  20.             return;
  21.         }
  22.  
  23.         //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
  24.         public static void MyDelegateFunc()
  25.         {
  26.             Console.WriteLine("delegate function...");
  27.         }
  28.     }
  29. }
  30.  
  31. 编译执行结果:
  32.  
  33. # TestClass.exe
  34. delegate function...

使用Delegate类和Override实现多态的比较

-----------------------------------------------

1.使用Delegate类的时候,下面的例子可以很清楚的说明。

1.1 首先定义一个动物基类(MyAnimalDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。

并且在ShowAnimalType方法中调用Delegate引用的实例方法

1.2 定义狮子(LionDelegateClass)和马(HorseDelegateClass)两个子类。Delegate与各自的实例方法绑定

实现不同的属性显示(ShowAnimalType)方法。

  1. ////Delegate example (TestClass.cs):
  2.  
  3. using System;
  4.  
  5. namespace MySample
  6. {
  7.    class TestClass
  8.    {
  9.       [STAThread]
  10.       static void Main(string[] args)
  11.       {
  12.       //狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用
  13.          LionDelegateClass lionDelegate = new LionDelegateClass();
  14.          lionDelegate.ShowAnimalType("MySample");
  15.  
  16.       //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用
  17.          HorseDelegateClass horseDelegate = new HorseDelegateClass();
  18.          horseDelegate.ShowAnimalType("MySample");
  19.       }
  20.    }
  21.  
  22.    //动物基类(MyAnimalDelegateClass)
  23.    public class MyAnimalDelegateClass
  24.    {
  25.       //Delegate数据结构定义
  26.       public delegate void DelegateFunction(string strFuncName);
  27.  
  28.       private DelegateFunction m_delegateFunction = null;
  29.  
  30.       //Delegate类型的属性
  31.       public DelegateFunction delegateFunction
  32.       {
  33.          get
  34.          {
  35.             return m_delegateFunction;
  36.          }
  37.          set
  38.          {
  39.             m_delegateFunction = value;
  40.          }
  41.       }
  42.  
  43.       //属性显示(ShowAnimalType)方法
  44.       public void ShowAnimalType(string strFuncName)
  45.       {
  46.          if (delegateFunction != null)
  47.          {
  48.             object[] args = {strFuncName};
  49.          //调用Delegate引用的实例方法
  50.             delegateFunction.DynamicInvoke(args);
  51.          }
  52.       }
  53.    }
  54.  
  55.    //狮子(LionDelegateClass)
  56.    public class LionDelegateClass:MyAnimalDelegateClass
  57.    {
  58.       public LionDelegateClass()
  59.       {
  60.          this.delegateFunction = new DelegateFunction(subFunction1);
  61.       }
  62.  
  63.       //狮子(LionDelegateClass)实例方法的实装
  64.       private void subFunction1(string strFuncName)
  65.       {
  66.          System.Console.WriteLine(
  67.             string.Format("[{0}]This is a lion....", strFuncName));
  68.       }
  69.    }
  70.  
  71.    //马(HorseDelegateClass)
  72.    public class HorseDelegateClass:MyAnimalDelegateClass
  73.    {
  74.       public HorseDelegateClass()
  75.       {
  76.          this.delegateFunction = new DelegateFunction(subFunction2);
  77.       }
  78.  
  79.       //马(HorseDelegateClass)实例方法的实装
  80.       private void subFunction2(string strFuncName)
  81.       {
  82.          System.Console.WriteLine(
  83.             string.Format("[{0}]This is a horse....", strFuncName));
  84.       }
  85.    }
  86. }
  87.  
  88. 编译执行结果:
  89.  
  90. # TestClass.exe
  91.  
  92. [MySample]This is a lion....
  93. [MySample]This is a horse....

2.使用Override实装的时候,参考下面的例子。

1.1 首先定义一个动物基类(AbstractAnimalNoDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。

并且在ShowAnimalType方法中调用抽象方法(NoDelegateFunction)

1.2 定义狮子(LionNoDelegateClass)和马(HorseNoDelegateClass)两个子类。

子类中实装抽象方法(NoDelegateFunction)

实现不同的属性显示(ShowAnimalType)方法。

  1. ////Override example (TestClass.cs):
  2.  
  3. using System;
  4.  
  5. namespace MySample
  6. {
  7.    class TestClass
  8.    {
  9.       [STAThread]
  10.       static void Main(string[] args)
  11.       {
  12.           //狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用
  13.           LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();
  14.        lionNoDelegate.ShowAnimalType("MySample");
  15.  
  16.           //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用
  17.        HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();
  18.        horseNoDelegate.ShowAnimalType("MySample");
  19.       }
  20.    }
  21.  
  22.    //动物基类(AbstractAnimalNoDelegateClass)
  23.     public abstract class AbstractAnimalNoDelegateClass
  24.     {
  25.         public void ShowAnimalType(string strFuncName)
  26.         {
  27.             //抽象方法(NoDelegateFunction)调用
  28.             NoDelegateFunction(strFuncName);
  29.         }
  30.         //在基类中定义抽象方法(NoDelegateFunction)
  31.         protected abstract void NoDelegateFunction(string strFuncName);
  32.     }
  33.  
  34.     //狮子(LionNoDelegateClass )
  35.     public class LionNoDelegateClass:AbstractAnimalNoDelegateClass
  36.     {
  37.     // 子类中实装抽象方法(NoDelegateFunction)
  38.         protected override void NoDelegateFunction(string strFuncName)
  39.         {
  40.             System.Console.WriteLine(
  41.                 string.Format("[{0}]This is a lion....", strFuncName));
  42.         }
  43.     }
  44.  
  45.    //马(HorseNoDelegateClass )
  46.     public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass
  47.     {
  48.     // 子类中实装抽象方法(NoDelegateFunction)
  49.         protected override void NoDelegateFunction(string strFuncName)
  50.         {
  51.             System.Console.WriteLine(
  52.                 string.Format("[{0}]This is a horse....", strFuncName));
  53.         }
  54.     }
  55. }
  56.  
  57. 编译执行结果:
  58.  
  59. # TestClass.exe
  60.  
  61. [MySample]This is a lion....
  62. [MySample]This is a horse....

3.比较Delegate和Override实装方式

可以看出Delegate实装方式中,相当于定义一个函数指针的成员变量。

通过把实装函数的地址赋给该成员变量,实现同样的方法,处理方式的不同。

而Override方式中,则是在父类中预先定义好接口,通过实装的不同,

来实现同样的方法,处理方式的不同。

Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。

Override方式封装性好,相对比较安全。

MulticastDelegate 类的应用

---------------------------------

在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数,

并且可以按照委托的先后顺序,执行相应的函数。

如下例:

  1. using System;
  2.  
  3. namespace MySample
  4. {
  5.     class TestClass
  6.     {
  7.         [STAThread]
  8.         static void Main(string[] args)
  9.         {
  10.             DogDelegateClass dogDelegate = new DogDelegateClass();
  11.             dogDelegate.ShowAnimalType("MySample");
  12.  
  13.     }
  14.  
  15.     public class MyAnimalDelegateClass
  16.     {
  17.         public delegate void DelegateFunction(string strFuncName);
  18.  
  19.         private DelegateFunction m_delegateFunction = null;
  20.  
  21.         public DelegateFunction delegateFunction
  22.         {
  23.             get
  24.             {
  25.                 return m_delegateFunction;
  26.             }
  27.             set
  28.             {
  29.                 m_delegateFunction = value;
  30.             }
  31.         }
  32.  
  33.         public void ShowAnimalType(string strFuncName)
  34.         {
  35.             if (delegateFunction != null)
  36.             {
  37.                 object[] args = {strFuncName};
  38.  
  39.                 delegateFunction.DynamicInvoke(args);
  40.             }
  41.         }
  42.     }
  43.  
  44.     public class DogDelegateClass:MyAnimalDelegateClass
  45.     {
  46.         public DogDelegateClass()
  47.         {
  48.       //多路委托函数 设定
  49.             this.delegateFunction = new DelegateFunction(subFunction31);
  50.             this.delegateFunction += new DelegateFunction(subFunction32);
  51.         }
  52.   //委托函数1
  53.         private void subFunction31(string strFuncName)
  54.         {
  55.             System.Console.WriteLine(
  56.                 string.Format("[{0}]This is a dog....", strFuncName));
  57.         }
  58.   //委托函数2
  59.         private void subFunction32(string strFuncName)
  60.         {
  61.             System.Console.WriteLine(
  62.                 string.Format("[{0}]This is a nice dog....", strFuncName));
  63.         }
  64.     }
  65. }
  66.  
  67. 编译执行结果:
  68.  
  69. # TestClass.exe
  70.  
  71. [MySample]This is a dog....
  72. [MySample]This is a nice dog....

转载请表明出处!

C# Deldegate的使用的更多相关文章

随机推荐

  1. HDU 4059 The Boss on Mars(容斥原理 + 四次方求和)

    传送门 The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. 【Python】使用torrentParser1.03对多文件torrent的分析结果

    Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...

  3. Discuz常见小问题-_如何修改网站LOGO

    1 界面-风格管理,点击编辑 2 默认的LOGO图片叫做logo.png,存放在X:\PHPNow\htdocs\Discuz\upload\static\image\common文件夹下面,其中X是 ...

  4. spring MVC、mybatis配置读写分离,ReplicationDriver(转载)

    参考:http://shift-alt-ctrl.iteye.com/blog/2271730c 环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现 ...

  5. iOS编程(双语版) - 视图 - 手工代码(不使用向导)创建视图

    如何创建一个空的项目,最早的时候XCode的项目想到中,还有Empty Application template这个选项,后来Apple把它 给去掉了. 我们创建一个单视图项目. 1) 删除main. ...

  6. javascript 替换 window.onload 的 document.ready

    通常我们想要在页面内容加载完成后运行 JS 时,都会使用 window.onload 来处理,比如: window.onload = function(){      alert('Hello Wor ...

  7. LintCode: Longest Words

    C++ class Solution { public: /** * @param dictionary: a vector of strings * @return: a vector of str ...

  8. vsphere 5.1 改进和SSO理解

    虚拟交换器 以5.1版的vSphere而言,VMware在VDS上提供一些新功能.例如,现在可以用快照的方式,来备份还原VDS组态及网络端口群组(port group)的组态,以因应vCenter S ...

  9. postman添加cookie

    检索cookie: 1.启动拦截器(需安装Postman Interceptor) 2.在测试部分,你可以使用responseCookies对象,他将返回一个cookie对象的数组.使用postman ...

  10. sublime text执行PHP代码

    新建编译系统 { "cmd": ["php", "$file"], "file_regex": "php$&q ...