使用委托
按照函数类型定义委托
委托的作用:1、动态调用函数
2、函数回调和事件机制的基础
对于有C++经验的人来说,可以把委托理解为函数指针;对于没有C++经验的人来说,委托可以理解为一种特殊的数据类型---函数的类型。
对于C#来说,和普通的数据类型一样,函数也有类型,只不过函数的类型是通过函数的返回值类型以及参数列表决定的,如果两个函数的返回类型,以及参数的顺序和类型,参数的数量完全相同,那么就可以说这两个函数类型相同。
那么,就可以用委托来表示某种特定类型的函数,并且可以表示多个函数,使用委托就好像调用这些函数,由于它可以串联多个函数,所以就会按照串联的顺序依次调用这些函数,如果有返回值,那么将返回最后一个函数的返回值。
委托既然可以理解为一种特定的类型,那么,它实质上是一个类,编译器会根据关键字“delegate”自动从System.Delegate类派生一个类,那么,委托也可以有它的访问修饰符,如private、public等,同业也有它自己的成员。
C#中用关键字“delegate”来定义委托(定义一种数据类型)
Delegate returntype DelegateName(Type1 para1,Type2 para2,…);
用委托动态调用函数
既然委托可以理解为一种特定的数据类型,那么使用委托跟使用其他数据类型一样,一般分为三个步骤:1、声明委托变量,跟声明普通类型的变量一样。2、为委托变量赋值,委托变量可以看成是一个函数链表,可以通过”=“为函数链表指定唯一函数,也可以通过”+=“为函数链表指定多个函数,还一个通过”-=“从函数链表中删除指定函数。3使用委托变量,像使用函数那样直接使用委托变量,例如定义了一个委托变量voidFunc,那么使用它的时候,直接”voidFunction()“,也可以通过调用委托变量的成员函数”invoke()“来使用委托变量,例如”voidFunc.Invoke()“。
用委托传递函数参数
在使用委托变量的时候指定参数而已。
例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateApp
{
class Program
{
delegate void DSimpleVoidFunc();
delegate float DFloatFunc(int val1,float val2);
static void Main(string[] args)
{
DSimpleVoidFunc voidfun; //声明委托变量
voidfun = PrintHaHa; //为委托变量赋值
voidfun(); //使用委托变量
voidfun += PrintHeHe;
voidfun();
voidfun -= PrintHeHe;
voidfun.Invoke();
UseParaDelegate();
Console.ReadLine();
}
static void PrintHaHa()
{
Console.WriteLine("HaHa...");
}
static void PrintHeHe()
{
Console.WriteLine("HeHe...");
}
static void UseParaDelegate()
{
DFloatFunc floatfunc;
float result;
floatfunc = Add;
result = floatfunc(5, 2.0f);
Console.WriteLine("1. Result={0}",result);
floatfunc += Sub;
result = floatfunc(5, 2.0f);
Console.WriteLine("2. Result={0}", result);
floatfunc += Mul;
result = floatfunc(5, 2.0f);
Console.WriteLine("3. Result={0}", result);
floatfunc -= Mul;
floatfunc += Add;
result = floatfunc.Invoke(5,2.0f);
Console.WriteLine("4. Result={0}", result);
}
static float Add(int val1,float val2)
{
Console.WriteLine("{0}+{1}={2}", val1, val2, val1 + val2);
return val1 + val2;
}
static float Sub(int val1,float val2)
{
Console.WriteLine("{0}-{1}={2}", val1, val2, val1 - val2);
return val1 - val2;
}
static float Mul(int val1,float val2)
{
Console.WriteLine("{0}*{1}={2}", val1, val2, val1 * val2);
return val1 * val2;
}
}
}