(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,去掉方法体的大括号{}。