一、定义
委托(delegate)是C#语言的一种指针,是函数指针的升级版。
C语言语法中函数指针定义及使用样例
#include <stdio.h>
//c语言中的函数指针类型定义
typedef int(*Calc)(int a, int b);
int Add(int a, int b){return a + b;}
int Sub(int a, int b){return a - b;}
int main()
{
int x = 100;
int y = 200;
int z = 0;
//普通函数的调用
z = Add(x, y);
printf("%d+%d=%d\n", x, y, z);
z = Sub(x, y);
printf("%d+%d=%d\n", x, y, z);
//函数指针使用
Calc funcPoint1 = &Add;
Calc funcPoint2 = ⋐
//函数指针调用
z = funcPoint1(x, y);
printf("%d+%d=%d\n", x, y, z);
z = funcPoint2(x, y);
printf("%d+%d=%d\n", x, y, z);
}
二、直接调用与间接调用
直接调用:通过函数名来调用函数,CPU通过函数名直接获得函数所在地址并开始运行。
间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值获得函数所在地址并开始执行。
三、委托的简单使用
Action委托
Func委托
使用C#类库中已经定义好的Action及Func委托定义委托。样例说明
using System;
namespace DelegateExample
{
class Program
{
static void Main(string[] args)
{
int x = 100;
int y = 200;
int z = 0;
//----------------------------------------------------------------------------
//调用类的方法,需首先实例化对象
Calculator cal = new Calculator();
//直接调用类实例中的方法report()
cal.Report(); //输出第一次"I have 3 mothods."
//使用委托方式间接调用Calculator()实例对象的Report()方法
//Action关键字用来定义无返回值的委托
Action action = new Action(cal.Report);
action.Invoke();//输出第二次"I have 3 mothods."
//使用委托间接调用对象方法可以使用简便写法。
action(); //输出第三次"I have 3 mothods."
//-----------------------------------------------------------------------------
//使用委托方式间接调用Calculator()实例对象的Add()和Sub()方法
//Func关键字用来定义有形参和返回值的委托
Func<int, int, int> funcAdd= new Func<int, int, int>(cal.Add);
Func<int, int, int> funcSub = new Func<int, int, int>(cal.Sub);
z = funcAdd.Invoke(x, y);
Console.WriteLine(z);
z = funcSub.Invoke(x, y);
Console.WriteLine(z);
//-----------------------------------------------------------------------------
//Func类型委托对象简单调用方式调用(去掉了Invoke方法)
z = funcAdd(x, y);
Console.WriteLine(z);
z = funcSub(x, y);
Console.WriteLine(z);
}
}
public class Calculator
{
public void Report()
{
Console.WriteLine("I have 3 mothods.");
}
public int Add(int x ,int y)
{
return x + y;
}
public int Sub(int x, int y)
{
return x - y;
}
}
}
C#自定义委托
namespace DelegateExample
{
//自定义委托类型实例化
public delegate double Calc(double x, double y);
class Program
{
static void Main(string[] args)
{
double x = 100;
double y = 200;
double z = 0;
//调用类的方法,需首先实例化对象
Calculator cal = new Calculator();
//自定义委托类型实例化
Calc calc1 = new Calc(cal.Add);
Calc calc2 = new Calc(cal.Sub);
Calc calc3 = new Calc(cal.Mul);
Calc calc4 = new Calc(cal.Div);
//自定义委托调用
z = calc1.Invoke(x, y);
Console.WriteLine(z);
z = calc2.Invoke(x, y);
Console.WriteLine(z);
z = calc3.Invoke(x, y);
Console.WriteLine(z);
z = calc4.Invoke(x, y);
Console.WriteLine(z);
}
}
public class Calculator
{
public void Report()
{
Console.WriteLine("I have 3 mothods.");
}
public double Add(double x, double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
}
上例中自定义委托实例调用的简化调用方式
z = calc1(x, y);
Console.WriteLine(z);
z = calc2(x, y);
Console.WriteLine(z);
z = calc3(x, y);
Console.WriteLine(z);
z = calc4(x, y);
Console.WriteLine(z);