【c#心得记录】委托细节三

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2021-12-29

#【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;
};

成为第一个回答人

评论

登录后才可发表内容
  • 主题

    20

  • 帖子

    80

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0852s Mem:2047Kb