首页 > 其他分享 >Delegate类简介

Delegate类简介

时间:2023-01-05 14:06:44浏览次数:47  
标签:strFuncName ShowAnimalType 简介 void Delegate public string


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

{

定义一个Delegate函数数据结构

​​delegate​​ void GoDelegate();


[STAThread]

static void Main(string[] args)

{

数据变量指向实例方法

GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);


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

goDelegate();

return;

}



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

public static void MyDelegateFunc()

{

​​delegate​​ function...");

}

}

}



​​​编译执行​​​结果:

# TestCla​​​ss.exe​​​​delegate​​​ function...

使用Delegate类和Override实现​​​多态​​​的比较
-----------------------------------------------
1.使用Delegate类的时候,下面的例子可以很清楚的说明。
 首先定义一个动物​​​基类​​​(MyAnimalDelegateClass), ​​基类​​​中有显示属性的(ShowAnimalType)的public方法。
     并且在ShowAnimalType方法中调用Delegate引用的实例方法

 定义狮子(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

{

数据结构定义

public delegate void DelegateFunction(string strFuncName);


private DelegateFunction m_delegateFunction = null;


类型的属性

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));

}

}

}



​​​编译执行​​​结果:

# TestCla​​​ss.exe​​​
[MySample]This is a lion....
[MySample]This is a horse....

2.使用Override实装的时候,参考下面的例子。
 首先定义一个动物基类(AbstractAnimalNoDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。
     并且在ShowAnimalType方法中调用​​​抽象方法​​​(NoDelegateFunction)

 定义狮子(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)

​​​abstract​​​Class

{

public void ShowAnimalType(string strFuncName)

{

​​​抽象方法​​​(NoDelegateFunction)调用

NoDelegateFunction(strFuncName);

}

在基类中定义抽象方法(NoDelegateFunction)

​​​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));

}

}

}



​​​编译执行​​​结果:

# TestCla​​​ss.exe​​​
[MySample]This is a lion....
[MySample]This is a horse....

3.比较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....

标签:strFuncName,ShowAnimalType,简介,void,Delegate,public,string
From: https://blog.51cto.com/u_8378185/5991006

相关文章

  • 第二十一章《万年历》第1节:万年历项目简介
    ​万年历项目实现的是一款日历软件,它能够展示出任意年份的日历,除此之外,该软件还能以红色字体标出每个月的阳历节日。21.1.1万年历功能简介万年历软件的运行结果如图21-1所示......
  • STM32简介
    1.STM32分类STM32有不同内核的IC,如下图所示:2.命名规则命名规则如下图所示,如我有一款STM32芯片名字为:STM32F407ZGT6STM32:ST公司的ARM32bit微控制器F:通用性其......
  • HTML5 Web SQL 数据库简介
    WebSQL数据库API并不是HTML5规范的一部分,但是它是一个独立的规范,引入了一组使用SQL操作客户端数据库的APIs。WebSQL数据库可以在最新版的Safari,Chrome和Ope......
  • 常用EMC元器件简介——防护器件
    在电子产品中,需要防护的电路主要是电源和信号,所处的位置不同其防护等级和防护方案也不同,介绍三种最常用的防护器件:TVS管,气体放电管、半导体放电管。一、瞬态抑制二极管(TVS)1......
  • 简易PC基准测试丨PerformanceTest功能简介
    简易PC基准测试1、将您的PC的性能与世界各地的类似计算机进行比较。2、衡量配置更改和硬件升级的效果。3、自1998年以来的行业标准。您可以直接从USB驱动......
  • 【Kafka技术内幕】(二):Kafka简介
    【Kafka技术内幕】(二):Kafka简介2021年03月22日19:43 ·  阅读132我是少侠露飞。学习塑造人生,技术改变世界。文章目录什么是KafkaKafka的应用Kafka......
  • 科普系列:诊断路由类型简介及测试实践
    一、简介  当前车载以太网得到了大范围应用,但出于成本、可靠性等综合因素的考虑,CAN和LIN仍大范围应用于车载总线中,CAN和LIN之间的信息交互的需求仍然很大,承载着CAN-CA......
  • C# 委托事件简介
    简单理解C#委托事件,示例如下所示:usingSystem;///<summary>///---------------------委托步骤---------------------///第一步:声明委托///第二步:委托使用方法的......
  • SA612M期货订轧、SA612M化学成分、SA612M简介
    1、SA612M钢板介绍:SA612M是美标锅炉压力容器用钢板属于中低温焊接压力容器,是一种中低温焊接压力容器用镇静C-Mn-Si钢板,SA612M钢板执行标准:舞钢执行标准WYJ059-2006。2、SA......
  • 建筑软件解决方案丨Bluebeam简介
    BluebeamRevu和BluebeamCloud让团队可以灵活地在任何地方通过设计、构建和移交进行协作。 桌面和云协作解决方案桌面和云协作解决方案基于开放标准构建,因此......