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数据变量执行实例方法 A very basic example (TestClass.cs):
 using System;

 namespace MySample
{
class TestClass
{
//1.定义一个Delegate函数数据结构
public delegate void GoDelegate(); [STAThread]
static void Main(string[] args)
{
//3.Delegate数据变量指向实例方法
GoDelegate goDelegate = new GoDelegate( MyDelegateFunc); //4.通过Delegate数据变量执行实例方法
goDelegate();
return;
} //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
public static void MyDelegateFunc()
{
Console.WriteLine("delegate function...");
}
}
}
编译执行结果:

# 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):
 using System;
namespace MySample
{
class TestClass
{
[STAThread]
static void Main(string[] args)
{
//狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用
LionDelegateClass lionDelegate = new LionDelegateClass();
lionDelegate.ShowAnimalType("MySample"); //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用
HorseDelegateClass horseDelegate = new HorseDelegateClass();
horseDelegate.ShowAnimalType("MySample");
}
} //动物基类(MyAnimalDelegateClass)
public class MyAnimalDelegateClass
{
//Delegate数据结构定义
public delegate void DelegateFunction(string strFuncName); private DelegateFunction m_delegateFunction = null; //Delegate类型的属性
public DelegateFunction delegateFunction
{
get
{
return m_delegateFunction;
}
set
{
m_delegateFunction = value;
}
} //属性显示(ShowAnimalType)方法
public void ShowAnimalType(string strFuncName)
{
if (delegateFunction != null)
{
object[] args = {strFuncName};
//调用Delegate引用的实例方法
delegateFunction.DynamicInvoke(args);
}
}
} //狮子(LionDelegateClass)
public class LionDelegateClass:MyAnimalDelegateClass
{
public LionDelegateClass()
{
this.delegateFunction = new DelegateFunction(subFunction1);
} //狮子(LionDelegateClass)实例方法的实装
private void subFunction1(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a lion....", strFuncName));
}
} //马(HorseDelegateClass)
public class HorseDelegateClass:MyAnimalDelegateClass
{
public HorseDelegateClass()
{
this.delegateFunction = new DelegateFunction(subFunction2);
} //马(HorseDelegateClass)实例方法的实装
private void subFunction2(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a horse....", strFuncName));
}
}
}
编译执行结果:

# 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):
 using System;
namespace MySample
{
class TestClass
{
[STAThread]
static void Main(string[] args)
{
//狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用
LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();
lionNoDelegate.ShowAnimalType("MySample"); //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用
HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();
horseNoDelegate.ShowAnimalType("MySample");
}
} //动物基类(AbstractAnimalNoDelegateClass)
public abstract class AbstractAnimalNoDelegateClass
{
public void ShowAnimalType(string strFuncName)
{
//抽象方法(NoDelegateFunction)调用
NoDelegateFunction(strFuncName);
}
//在基类中定义抽象方法(NoDelegateFunction)
protected abstract void NoDelegateFunction(string strFuncName);
} //狮子(LionNoDelegateClass )
public class LionNoDelegateClass:AbstractAnimalNoDelegateClass
{
// 子类中实装抽象方法(NoDelegateFunction)
protected override void NoDelegateFunction(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a lion....", strFuncName));
}
} //马(HorseNoDelegateClass )
public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass
{
// 子类中实装抽象方法(NoDelegateFunction)
protected override void NoDelegateFunction(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a horse....", strFuncName));
}
}
}

编译执行结果:

# TestClass.exe

[MySample]This is a lion....
[MySample]This is a horse.... 3.比较Delegate和Override实装方式
可以看出Delegate实装方式中,相当于定义一个函数指针成员变量
通过把实装函数的地址赋给该成员变量,实现同样的方法,处理方式的不同。
而Override方式中,则是在父类中预先定义好接口,通过实装的不同,
来实现同样的方法,处理方式的不同。
Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。
Override方式封装性好,相对比较安全。 MulticastDelegate 类的应用
---------------------------------
在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数,
并且可以按照委托的先后顺序,执行相应的函数。 如下例:
 using System;
namespace MySample
{
class TestClass
{
[STAThread]
static void Main(string[] args)
{
DogDelegateClass dogDelegate = new DogDelegateClass();
dogDelegate.ShowAnimalType("MySample"); } public class MyAnimalDelegateClass
{
public delegate void DelegateFunction(string strFuncName); private DelegateFunction m_delegateFunction = null; public DelegateFunction delegateFunction
{
get
{
return m_delegateFunction;
}
set
{
m_delegateFunction = value;
}
} public void ShowAnimalType(string strFuncName)
{
if (delegateFunction != null)
{
object[] args = {strFuncName}; delegateFunction.DynamicInvoke(args);
}
}
} public class DogDelegateClass:MyAnimalDelegateClass
{
public DogDelegateClass()
{
//多路委托函数 设定
this.delegateFunction = new DelegateFunction(subFunction31);
this.delegateFunction += new DelegateFunction(subFunction32);
}
//委托函数1
private void subFunction31(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a dog....", strFuncName));
}
//委托函数2
private void subFunction32(string strFuncName)
{
System.Console.WriteLine(
string.Format("[{0}]This is a nice dog....", strFuncName));
}
}
}

编译执行结果:

# TestClass.exe

[MySample]This is a dog....
[MySample]This is a nice dog....

Delegate。。的更多相关文章

  1. 从此走上一条iOS程序猿不归路。。。

    新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...

  2. .NET6中一些常用组件的配置及使用记录,持续更新中。。。

    NET6App 介绍 .NET 6的CoreApp框架,用来学习.NET6的一些变动和新特性,使用EFCore,等一系列组件的运用,每个用单独的文档篇章记录,持续更新文档哦. 如果对您有帮助,点击右上 ...

  3. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  4. 让 ASP.NET vNext 在 Mac OS 中飞呀飞。。。

    写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homebrew 使用 Homebrew,安装 KVM Install Subl ...

  5. Repository 仓储,你的归宿究竟在哪?(三)-SELECT 某某某。。。

    写在前面 首先,本篇博文主要包含两个主题: 领域服务中使用仓储 SELECT 某某某(有点晕?请看下面.) 上一篇:Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗? ...

  6. 由objC运行时所想到的。。。

    objC语言不仅仅有着面向对象的特点(封装,继承和多态),也拥有类似脚本语言的灵活(运行时),这让objC有着很多奇特的功能-可在运行时添加给类或对象添加方法,甚至可以添加类方法,甚至可以动态创建类. ...

  7. Sublime Text 3 全程详细图文原创教程(持续更新中。。。)

    一. 前言 使用Sublime Text 也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知.最初也是不知道从何下手,满世界地查找资料,但能查阅到的资料,苦于它们的零碎.片面,不够系统 ...

  8. dom操作导致超级卡顿。。。

    var i=0;j=30;setinterval(function(){ document.getElementId(idname).style.top=j+'px'; i<3?i++:i=0; ...

  9. 搭建自己私有的PKM系统,各家PKM大比拼。。附:构建自己熟悉的基础Docker,破解联通光猫

    Docker这容器真是很好玩!干啥都想上docker了,快疯了. 这不,最近wiz笔记开始收费,很是不爽,需要寻求新的PKM系统了.备选及落选理由如下: wiz笔记 -- 好用,顺手.要开始收费了,不 ...

  10. while 循环 。。

    这是一个可以循环到天荒地老的循环: 如果while 为真就一直循环下去: count=0 while True: count+=1 if count>50 and count<60: co ...

随机推荐

  1. 使用本地光盘安装Microsoft .NET Framework 3.5 for Win8/WinServer2012

    如何使用本地源安装Microsoft .NET Framework 3.5 作为SQL Server 2012的 必要组件,校验组件过程有个小BUG,即使没有安装也通过,但会卡在安装环节(enabli ...

  2. 在jsp中用EL 表达来获取表单中的参数

     在一个JSP页面转到另一个JSP页面时,对表单中的参数用EL表达式提取为:     <form action="sampleJsp.jsp" method="po ...

  3. CorAnimation7-高效绘图、图像IO以及图层性能

    高效绘图 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必 ...

  4. CoreAnimation1-图层树、寄宿图以及图层几何学

    (一)图层的树状结构 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只 ...

  5. 左偏树(Leftist Heap/Tree)简介及代码

    左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...

  6. 解决打不开jar包

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...

  7. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  8. OSPF + LVS ,突破LVS瓶颈 (转)

    突破LVS瓶颈,LVS Cluster部署(OSPF + LVS) 前言 架构简图 架构优势 部署方法 1.硬件资源准备 2.三层设备OSPF配置 3.LVS调度机的OSPF配置 a.安装软路由软件q ...

  9. VBA开发经验总结之一:利用Range对象设计用户界面

    读罢<EXCEL专业开发>,最大的震撼就是著者对VBA技术的追求以及对Excel艺术品般的设计.受到此书著者的启发,也打算把自己在日常开发中一些经验总结出来,一来作为自己的知识储备,二来也 ...

  10. oracle删除用户所有表

    在删除数据表的时候往往遇到外键约束无法删除的情况,我们可以通过以下几步将数据库表删除,建议在删除库之前先对数据库进行备份,养成良好习惯. 1.删除外键 --查询用户所有表的外键,owner条件为use ...