包含多个方法的委托成为多播委托,调用多播委托,可以按照顺序连续调用多个方法,因此,委托的签名就必须返回void;
否则,就只能得到委托调用的最好一个方法的结果
- 多播委托可以用运算符"+“和”+=“给委托添加方法调用,同样也可以用运算符”-“和”-="给委托删除方法调用
void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}
static void Goodbye(string s)
{
System.Console.WriteLine(" Goodbye, {0}!", s);
throw new Exception("error");
}
Action<string> ac=Hello;
ac+=Goodbye;
- 多播委托包含一个逐个调用委托集合,如果通过委托嗲用的其中一个方法抛出一个异常,整个迭代就会停止;、
为了避免这个问题,应该自己迭代方法列表。Delegate类定义GetInvocationList()方法,他返回一个Delegate
对象数组
static void Goodbye()
{
Action ac=Hello;
ac+=Goodbye;
Delegate[] delegates=ac.GetInvocationList();
foreach(Action action in delegates)
{
try
{
//action();
action.DynamicInvoke()(;
}catch(Exception)
{
}
}
}
- 匿名方法
namespace _009_匿名方法 {
class Program {
static int Test1(int arg1, int arg2)
{
return arg1 + arg2;
}
static void Main(string[] args)
{
//Func<int, int, int> plus = Test1;
//修改成匿名方法的形式
Func<int, int, int> plus = delegate(int arg1, int arg2)
{
return arg1 + arg2;
};
//匿名方法 本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值
//Lambda表达式代替匿名方法
Func<int,int,int> plus = (a,b)=>{return a+b;};
Func<int, int> test2 = a => a+1;//lambda表示的参数只有一个的时候,可以不加上括号 当函数体的语句只有一句的时候,我们可以不加上大括号 也可以不加上return语句
Func<int, int> test3 = (a) =>
{
return a + 1;
};
Console.ReadKey();
}
}
}