# 委托 #
## 1、理解 ##
(1)委托类型用于定义和相应应用程序中的回调;
(2)使用回调,程序员可以使一个函数 返回报告给(即回调)另一个函数;
(3)委托是类型安全的对象,它指向程序中另一个以后会被调用的的方法。
## 2、定义委托 ##
(1)**使用delegate关键字
如:public delegate int XXX(int a,int b);
//定义了一个(可以指向任意方法)、
//(返回一个int类型返回值)、
//(接收两个int类型输入参数)的委托类型。
(2)当C#编译器处理委托类型时,将自动产生一个继承自System.MulticastDelegate的 **密封类XXX**以维护以后将要调用方法的列表。
(3)该 密封类XXX定义了三个公共方法:
public sealed class XXX : System.MulticastDelegate
{
//以同步方式调用委托对象维护的每个方法
public int Invoke(int a,int b);
//以异步方式开始调用委托对象维护的每个方法
public IAsyncResult BeginInvoke(int a,int b,asyncCallback cb,object state);
//以异步方式结束调用委托对象维护的每个方法
public int EndInvoke(IAsyncResult result);
}
## 3、委托实例 ##
//定义部分
public delegate int XXX(int a,int b);
public int Add(int x,int y)
{
return x + y;
}
//以下是控制台Main方法中的内容
XXX d = new XXX(Add);
Console.writeLine(d(10,11));
//控制台显示结果
21
## 1、理解 ##
(1)委托类型用于定义和相应应用程序中的回调;
(2)使用回调,程序员可以使一个函数 返回报告给(即回调)另一个函数;
(3)委托是类型安全的对象,它指向程序中另一个以后会被调用的的方法。
## 2、定义委托 ##
(1)**使用delegate关键字
如:public delegate int XXX(int a,int b);
//定义了一个(可以指向任意方法)、
//(返回一个int类型返回值)、
//(接收两个int类型输入参数)的委托类型。
(2)当C#编译器处理委托类型时,将自动产生一个继承自System.MulticastDelegate的 **密封类XXX**以维护以后将要调用方法的列表。
(3)该 密封类XXX定义了三个公共方法:
public sealed class XXX : System.MulticastDelegate
{
//以同步方式调用委托对象维护的每个方法
public int Invoke(int a,int b);
//以异步方式开始调用委托对象维护的每个方法
public IAsyncResult BeginInvoke(int a,int b,asyncCallback cb,object state);
//以异步方式结束调用委托对象维护的每个方法
public int EndInvoke(IAsyncResult result);
}
## 3、委托实例 ##
//定义部分
public delegate int XXX(int a,int b);
public int Add(int x,int y)
{
return x + y;
}
//以下是控制台Main方法中的内容
XXX d = new XXX(Add);
Console.writeLine(d(10,11));
//控制台显示结果
21
说明:实际上d(10,11)实际上在内存中调用了Invoke()方法
# 4、泛型委托:Action<>和Func<> #
## 使用委托的三个步骤: ##
1、自定义与方法Add匹配的委托XXX
2、创建委托的实例:XXX d = new XXX(Add);
3、调用委托对象的Invoke()方法来间接调用Add方法
## 使用Action<>委托: ##
1、创建委托的实例:Action<int,int> d = new Action<int,int>(Add);
2、调用委托对象的Invoke()方法来间接调用Add方法
缺点:Action<int,int>只能指向void返回值的方法
## 使用Func<>委托: ##
优点:相比Action<>,Func<>同时能指向void返回值的方法;Func<>的最后一个参数总是方法的返回值。
1、创建委托的实例:
Func<int,int,int> d = new Func<int,int,int>(Add);
2、调用委托对象的Invoke()方法来间接调用Add方法: