C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
定义一个委托的基本方法是使用delegate关键字,如下
public delegate int MyDelegate (string s);
其中int为返回值类型,string s为参数列表,MyDelegate为委托的名称,有了这个声明,我们就可以用这个委托调用参数为string,返回值为int的方法了。下面是一个简单的示例。
using System;
namespace Delegate
{
class Program
{
delegate int changeNum(int x);
static int Num=10;
static private int AddNum(int y)//注意委托调用的方法最好是静态的,否则需要先实例化对象
{
Num += y;
return Num;
}
static private int MultNum(int y)
{
Num *= y;
return Num;
}
static void Main(string[] args)
{
changeNum a = new changeNum(AddNum);
//一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。
//当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。
a(5);
Console.WriteLine("Num="+Num);
}
}
}
//输出为Num=15
委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面将上面代码的main函数部分略作改动
static void Main(string[] args)
{
changeNum a = new changeNum(AddNum);
changeNum b = new changeNum(MultNum);
changeNum c;
c = a;
c += b;
c(5);
Console.WriteLine("Num="+Num);
}
//输出为Num=75
除了delegate关键字,还有两种常用的委托为Action和Func。
Action就是一个预定义的没有返回值的委托,但它可以有参数。
using System;
namespace Delegate
{
class Program
{
//不需要提前声明委托
static int Num=10;
static private void AddNum(int y)
{
Num += y;
Console.WriteLine( Num);
}
static private void MultNum(int y)
{
Num *= y;
Console.WriteLine(Num);
}
static void Main(string[] args)
{
Action<int> d1 = new Action<int>(AddNum);//有一个参数int,所以要写Action<int>
Action<int> d2 = new Action<int>(MultNum);
Action<int> d3;
d3 = d1;
d3 += d2;
d3(5);
}
}
}
//输出为15 75
而Func则是一个预定义的有返回值(或许有参数)的委托
//前面部分同上
static void Main(string[] args)
{
Func<int,int> a = new Func<int,int>(AddNum);//<int,int>分别为返回值和参数
Func<int, int> b = new Func<int, int>(MultNum);
Func<int, int> c;
c = a;c += b;
c(5);
Console.WriteLine("Num="+Num);
}
//输出为Num=75