(3)多播委托能引用多个具有返回值的方法嘛?
  答案是,当然能。委托的方法可以是无返回值的,也可以是有返回值的。不过,对于有返回值的方法需要我们从委托列表上手动调用。否则,只能得到委托调用的后一个方法的结果。下面通过两段代码验证下:
  C#
public delegate string GetStrDelegate();
public class Program
{
public static void Main(string[] args)
{
GetStrDelegate del = Func1;
del += Func2;
del += Func3;
string result = del();
Console.WriteLine(result);
//控制台输出结果:
//You called me from Func3
}
public static string Func1()
{
return "You called me from Func1!";
}
public static string Func2()
{
return "You called me from Func2!";
}
public static string Func3()
{
return "You called me from Func3!";
}
}
  正确做法:利用GetInvocationList获得委托列表上所有方法,循环依次执行委托,并处理委托返回值。
  C#
public delegate string GetStrDelegate();
public class Program
{
public static void Main(string[] args)
{
GetStrDelegate del = Func1;
del += Func2;
del += Func3;
//获取委托链上所有方法
Delegate[] delList = del.GetInvocationList();
//遍历,分别处理每个方法的返回值
foreach (GetStrDelegate item in delList)
{
//执行当前委托
string result = item();
Console.WriteLine(result);
//控制台输出结果:
//You called me from Func1
//You called me from Func2
//You called me from Func3
}
Console.ReadKey();
}
public static string Func1()
{
return "You called me from Func1";
}
public static string Func2()
{
return "You called me from Func2";
}
public static string Func3()
{
return "You called me from Func3";
}
}
  1.3 匿名方法
  匿名方法是C#2.0版本引入的一个新特性,用来简化委托的声明。假如委托引用的方法只使用一次,那么没有必要声明这个方法,这时用匿名方法表示即可。
  C#
//step01:定义委托类型
public delegate string ProStrDelegate(string str);
public class Program
{
public static void Main(string[] args)
{
//step02:将匿名方法指定给委托对象
ProStrDelegate del = delegate(string str) { return str.ToUpper(); };
string result = del("KaSlFkaDhkjHe");
Console.WriteLine(result);
Console.ReadKey();
//输出:KASLFKAFHKJHE
}
}
  (1)匿名方法只是C#提供的一个语法糖,方便开发人员使用。在性能上与命名方法几乎无异。
  (2)匿名方法通常在下面情况下使用:
  1.委托需要指定一个临时方法,该方法使用次数极少;
  2.这个方法的代码很短,甚至可能比方法声明都短的情况下使用。
  1.4 Lambda表达式
  Lambda表达式是C#3.0版本引入的一个新特性,它提供了完成和匿名方法相同目标的更加简洁的格式。下面示例用Lambda表达式简化上述匿名方法的例子:
  C#
public delegate string ProStrDelegate(string str);
public class Program
{
public static void Main(string[] args)
{
//匿名委托
//ProStrDelegate del = delegate(string str) { return str.ToUpper(); };
//简化1
//ProStrDelegate del1 = (string str) =>{ return str.ToUpper(); };
//简化2
//ProStrDelegate del2 = (str) =>{ return str.ToUpper(); };
//简化3
ProStrDelegate del3 = str => str.ToUpper();
string result = del3("KaSlFkaDhkjHe");
Console.WriteLine(result);
Console.ReadKey();
//输出:KASLFKAFHKJHE
}
}
  简化1:去掉delegate关键字,用”=>”符号表示参数列表和方法体之间的关系;
  简化2:去掉方法的参数类型;假如只有一个参数,参数列表小括号()也可省略;
  简化3:如果方法体中的代码块只有一行,可以去掉return,去掉方法体的大括号{}。