<>C#委托(Delegate)

在C#的学习过程中,自然有我们的精神小伙——委托 的一席之地
本文就介绍一下C#中的委托,这位可以包含同类方法函数的小伙子

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。 委托(Delegate)
是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 委托就是用来储存方法的结构
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

<>声明和定义委托分为4个步骤

* 声明一个委托(函数指针)
* 创建委托对象
* 创造符合委托格式的函数(指针指向的函数)
* 将函数名称赋值给委托
Tips:委托对象为空是不能执行的,执行前先提前判断

代码实例如下
// 1. 声明一个委托(函数指针) delegate void delegateTest(int a,float b); // delegate
返回值类型 委托类型名(参数列表): // 2. 创建委托对象 public delegateTest dT1; //3.
创造符合委托格式的函数(指针指向的函数) public void Test(int a,float b) { a+=100; b*=2.0; Console.
WriteLine("a:{0},b:{1}", a,b); } static void Main(string[] args) { // 4.
将函数名称赋值给委托 dT1=new delegateTest(Test); //使用委托 dT1(1,1.0); //打印结果 //a=101,b=2.0 }
委托类型

* 委托/代理:句柄
* 委托是自定义类型
* 委托是引用类型
几种基础的委托结构

* 自定义委托 语法: delegate 返回类型 委托名([参数]);
* Action内置委托 语法: Action<[参数类型0-16个]> 委托名=被委托方法名;
* Func内置委托 语法: Function<[参数类型0-16个],返回类型> 委托名=被委托方法名;
* 多播委托 语法:委托名+=被委托方法名;委托名-=被委托方法名;
<>委托的用法

下面的实例演示了委托的一个用法,可以将定义的委托作为参数,就可以直接通过委托来调用委托中的方法了。
//声明委托 public delegate void OndelegateTest(int a,int b); public static void
TestNum1(int i,int j) { int num = i+j; Console.WriteLine("num:"+num); } public
static void TestNum2(int i,int j) { int num = i*j; Console.WriteLine("num:"+num)
; } // 该方法把委托作为参数,并使用它调用方法 public static void sendNum(OndelegateTest test) {
test(1,2); } static void Main(string[] args) { OndelegateTest d1=new
OndelegateTest(TestNum1); OndelegateTest d2=new OndelegateTest(TestNum2);
sendNum(d1); sendNum(d2); Console.ReadKey(); }
<>委托的多播(Multicasting of a Delegate)

委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的
多播(multicasting),也叫组播。下面的程序演示了委托的多播:
using System; //声明委托 delegate int NumberChanger(int n); namespace DelegateAppl
{ class TestDelegate { static int num = 10; public static int AddNum(int p) {
num+= p; return num; } public static int MultNum(int q) { num *= q; return num;
} public static int TestNum(int i) { num -= i; return num; } public static int
getNum() { return num; } static void Main(string[] args) { // 创建委托实例
NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger
nc2= new NumberChanger(MultNum); nc = nc1; nc += nc2; nc += TestNum; // 调用多播 nc(
5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 70

委托对象的绑定与解绑
delegate int NumberChanger(int n); NumberChanger nc; public static int TestNum(
int i) { num -= i; return num; } nc += TestNum;//委托的绑定 nc -= TestNum;//委托的解绑

技术
©2019-2020 Toolsou All rights reserved,
css中上下左右居中的几种实现方法[CISCN 2019 初赛]Love Mathc/c++语言实现登陆界面Unity3D 人称设置(第一人称视角、第三人称视角)Fastadmin框架自定义搜索操作流程2021最新Python自动化软件测试笔试题(含答案)黑客帝国装逼的代码雨mysql数据库设置字符集配置修改my.ini文件(windows)python之panda模块1Python学习笔记:基础+进阶10道练习题