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. BAT,你好!字幕组,再见!——也许要跟美剧说再见了~

    对于美剧迷来说,上周的星期六(2014 年11 月 22 日)是黑色的一天. 11 月 22 日,人人影视暂时关站,并发布公告称网站正在清理内容.虽然这不是人人影视第一次关站清理,而且人人影视还给出提 ...

  2. ckeditor 4.2.1_演示 ckeditor 上传&插入图片

    本文内容 FineUI ckeditor fckeditor/ckeditor 演示 ckeditor 4.2.1 上传&插入图片 最近看了一下 FineUI_v3.3.1 控件,对里边的 c ...

  3. C#.NET常见问题(FAQ)-如何把定义存放类实例的数组

    数组存放的可以是普通的int,double,string类型,也可以是自定义的类的实例   如果数组长度未知,可以用list对象存放   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: h ...

  4. C语言代码复习笔记:第二章

    输出星星 #include <stdio.h> void printStart( int num ) { ) { printf("*"); }; } int main( ...

  5. 最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复

    最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复 最新实战教程,Android自己主动化刷量.作弊与防作弊,案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android ...

  6. Python编程-数据库-利用PyMysql访问windows下的MySql数据库

    1. 下载PyMysql并且安装 下载地址 下载zip包后解压到目录,进入该目录,执行以下命令安装 python setup.py install 2. 编写一个简单的数据库访问程序 simple_m ...

  7. 为javascript设置默认参数值

    javascript(js)中如何为函数设置默认参数值,下面提供几种方法供参考. 第一种方法: function example(a,b){ var a = arguments[0] ? argume ...

  8. Ubuntu IntelliJ IDEA 注冊碼與Gradle相關

    一.Ubuntu IntelliJ IDEA 注冊碼 在线免费生成IntelliJ IDEA 15.0(16.+)注册码 注冊參考:https://www.iteblog.com/idea/ 依次选择 ...

  9. Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.html 在上一篇博文我们提到,分页有三种方法.其中,第三种是我们最常用的.然而,在实际应用过程中 ...

  10. BIEE启动关闭服务(转)

    一.环境说明 版本:BIEE11g (BIEE_11.1.1.9.0) OS:CentOS 6.5 64bit (所有的linux服务器都适用) 二.BIEE启动与关闭 BIEE11g 的启动包括三个 ...