1..net 委托类型用来定义和响应程序中的回调。.net委托类型是一个类型安全的对象,指向可以以后调用的其他方法。.net委托是内置支持多路广播和异步方法调用的对象。同时lamabda表达式只是匿名方法的一种,提供了一种简单的方式来使用委托。.net委托中的委托(包括自定义)都被自动赋予同步或异步访问方法的能力,可以不用手工创建与管理一个Thread对象而直接调用另一个辅助执行线程上的方法。
2.委托定义
public delegate int Func1(int x, int y); //该委托可以指向任何传入两个整数,返回一个整数的方法。
......
public class MyClass10
{
{
Func1 c = new Func1(add);
c(1, 2); //使用委托对象间接调用add方法
}
private static int add(int x, int y)
{
return x + y;
}
}
3.当C#编译器处理委托类型的时候,它先自动产生一个派生自System.MulticastDelegate的密封类。这个类与他的基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用方法的列表。
4.委托将生成3个公共方法
Invoke() //已同步方式调用委托对象维护的方法列表中的方法。这里调用这必须等待调用完成才能继续执行。
BeginInvoke() 和 EndInvoke() //在第二个执行线程上异步调用当前的方法。
public delegate int Func1(int x, int y);该委托将生成类似下面三个方法
public sealed class Func1:System.MulticastDelegate
{
public int Invoke(int x, int y);
public IAsyncResult BeginInvoke(int x, int y, AsynCallback cb, ojbect state);
public int EndInvoke(IAsyncResult result);
}
委托可以包含任意数量的out和ref参数以及用params关键字标记的数组参数。
5.基类MulticastDelegate和Delegate所包含的部分成员
Delegate对象代表一个可调用的特定方法,其属性Method:用以表示委托维护的静态方法的详细信息
属性Target:用以表示对象级别方法的所属对象,如果静态方法,则为null
Combine(): +=
Remove() : +=
RemoveAll() :移除所有方法
GetInvocationList(): MulticastDelegate中,返回System.Delegate数组。
6.多路广播
public class MyClass1
{
public delegate int FuncTest(int x, int y); //将委托定义在使用他的类型的作用域里
private FuncTest Func1 = null;
public void RegiterFunc1(FuncTest FuncHandle)
{
//if (Func1 == null)
// Func1 = FuncHandle;
//else
// Delegate.Combine(Func1, FuncHandle);
Func1 += FuncHandle; //等同于上面
}
public int Func2(int x, int y)
{
if (Func1 != null)
{
int i = Func1(x, y); //这里的返回值是列表中的最后的一个注册的的返回值。这里结果为:12,3
return i;
}
Console.WriteLine("list is null...");
return 0;
}
internal void UnRegisterFunc1(FuncTest func)
{
Func1 -= func;
}
}
public class MyClass2
{
public void Fun1()
{
MyClass1 cls1 = new MyClass1();
cls1.RegiterFunc1(new MyClass1.FuncTest(Func2)); //这里也可以使用方法组转换(通常使用的), cls1.RegiterFunc1(Func3);
MyClass1.FuncTest func3 = new MyClass1.FuncTest(Func3);
cls1.RegiterFunc1(func3);
cls1.Func2(8, 4);
cls1.UnRegisterFunc1(func3); //动态的注销委托通知
cls1.Func2(5, 2);
}
private int Func3(int x, int y)
{
int i = x + y;
Console.WriteLine(i);
return x + y;
}
private int Func2(int x, int y)
{
int i = x - y;
Console.WriteLine(i);
return x - y;
}
}
最后的结果为:4,12,3
7.泛型委托
public delegate void DeleTest<T>(T obj);
public class MyClass3
{
public void Func1()
{
DeleTest<int> deleInt = new DeleTest<int>(Func3);
deleInt(3);
DeleTest<string> deleString = new DeleTest<string>(Func4);
deleString("<T>Testing...");
}
public void Func3(int x)
{
Console.WriteLine(x);
}
public void Func4(string x)
{
Console.WriteLine(x);
}
}
8.框架内置泛型委托Action<>和Func<>
一.Action<>无返回值泛型委托、Func<>有返回值的委托。
二..示例
public class MyClass4
{
private void Func1()
{
Action<int, int> ShowResult = new Action<int, int>(ShowResultStr);
ShowResult(2, 2);
Func<int, int, int> ShowInt = new Func<int, int, int>(ReturnInt);
int result = ShowInt(3, 4);
}
public void ShowResultStr(int x, int y)
{
Console.WriteLine(x + y);
}
public int ReturnInt(int x, int y)
{
Console.WriteLine(x + y);
return x + y;
}
}