#【c#心得记录】委托细节二#
委托多播
委托多播允许在一个委托中注册多个方法 在内部维护了一个的委托数组
实例化三个委托
InputStrDelegate delInStr1 = (p) =>
{
Console.WriteLine("委托多播:1" + " 参数:" + p);
};
InputStrDelegate delInStr2 = (p) =>
{
Console.WriteLine("委托多播:2" + " 参数:" + p);
};
InputStrDelegate delInStr3 = (p) =>
{
Console.WriteLine("委托多播:3" + " 参数:" + p);
};
合并委托多播需要使用Delegate类提供的Combine静态方法
InputStrDelegate delInStrMC =
Delegate.Combine(delInStr1, delInStr2) as InputStrDelegate;
delInStrMC = Delegate.Combine(delInStrMC, delInStr3) as InputStrDelegate;
移除委托多播需要使用Delegate类提供的Remove静态方法
delInStrMC = Delegate.Remove(delInStrMC, delInStr2) as InputStrDelegate;
C#同时也提供了运算符重载 + – += -=用来快速的进行委托多播的注册与移除
InputStrDelegate delInStrMC1 = delInStr1 + delInStr2;
delInStrMC1 = delInStrMC1 + delInStr3;
delInStrMC1 = delInStrMC1 - delInStr2;
InputStrDelegate delInStrMC2 = delInStr1;
delInStrMC2 += delInStr2;
delInStrMC2 += delInStr3;
delInStrMC2 -= delInStr2;
委托多播的调用方式与委托调用方式相同(同步、异步) 需要注意的是:
委托多播合并的委托会顺序执行
有返回类型的委托只会返回最后一个返回类型
如果某个委托抛出异常异常 后面的委托不会继续执行
*谨慎使用匿名方法合并委托多播 考虑移除委托多播情况
使用委托带来的闭包问题
委托强类型
C#为了避免每次使用委托都需要声明委托类型 提供了多个强类型的委托类型便于复用
无返回类型的委托类型Action 提供了最多16个泛型参数作为输入列表
ction action = () =>
{
Console.WriteLine("委托强类型:Action");
};
Action actionInStr = (p) =>
{
Console.WriteLine("委托强类型:Action" + " 参数:" + p);
};
有返回类型的委托类型Func 提供了最多16个泛型参数作为输入列表 最后一个泛型指定返回类型类型
Func func = () =>
{
Console.WriteLine("委托强类型:Func");
return 0;
};
Func funcInStr = (p) =>
{
Console.WriteLine("委托强类型:Func" + " 参数:" + p);
return 0;
};
