委托(2)
2016-08-10 17:29
162 查看
匿名委托
当方法需要委托类型参数时,我们就传递类型与之对应的方法A过去,如果方法A在项目中仅使用了一次,那为了传参单独建一个方法就有点浪费了,这时我们可以使用匿名方法。//DelegateHelper.cs文件代码 public delegate string SayHiEventHandler(string name); public class DelegateHelper { public void SayHi(string name,SayHiEventHandler sayHi) { sayHi(name); } public string SayHiByEnglish(string name) { Console.WriteLine("Hello:" + name); return "success"; } public string SayHiByChinese(string name) { Console.WriteLine("你好:" + name); return "成功"; } } //Program.cs文件代码 class Program { static void Main(string[] args) { //传递已有方法 new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese); new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish); //传递匿名方法 new DelegateHelper().SayHi("蝈蝈", delegate(string name) { Console.WriteLine("匿名方法,name=" + name); return "匿名方法"; }); Console.ReadKey(); } }
运行结果如下:
Lambda表达式来源
匿名方法进一步简化就可以得到Lambda表达式,下面演示简化过程:static void Main(string[] args) { //匿名方法 new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler(delegate(string name) { Console.WriteLine(name); return name + "aaa"; })); //去掉delegate,增加=> new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((string name) => { Console.WriteLine(name); return name + "aaa"; })); //去掉参数类型 new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((name) => { Console.WriteLine(name); return name + "aaa"; })); //简化委托,去掉new SayHiEventHandler() new DelegateHelper().SayHi("蝈蝈", (name) => { Console.WriteLine(name); return name + "aaa"; }); //仅当参数只有一个时,可以省略参数的() new DelegateHelper().SayHi("蝈蝈", name => { Console.WriteLine(name); return name + "aaa"; }); //仅当委托的方法体只有一句话且没有返回值时可以省略方法体的{} //这就是我们常见的Lambda表达式 new DelegateHelper().GoodMorning("蝈蝈", name => Console.WriteLine(name + "aaa")); //当委托的方法体有返回值时不能省略方法体的{} new DelegateHelper().SayHi("蝈蝈", name => { return name + "aaa"; }); }
Action<>与Func<>
上面说到如果方法只用一次那可以用匿名方法来代替,如果委托只用一次的话也可以被代替,没参数、没返回值的委托用Action代替,有参数没返回值的委托用Action<>代替,有返回值的委托用Func<>代替。Program.cs文件代码:
class Program { static void Main(string[] args) { //有返回值 new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese); new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish); new DelegateHelper().SayHi("蝈蝈", delegate(string name) { Console.WriteLine("匿名方法,name=" + name); return "匿名方法返回值"; }); new DelegateHelper().SayHiByFunc("【func】蝈蝈", new DelegateHelper().SayHiByChinese); new DelegateHelper().SayHiByFunc("【func】guoguo", new DelegateHelper().SayHiByEnglish); new DelegateHelper().SayHiByFunc("【func】蝈蝈", delegate(string name) { Console.WriteLine("匿名方法,name=" + name); return "匿名方法返回值"; }); Console.WriteLine("----------------------------"); //没有返回值 new DelegateHelper().GoodMorning("蝈蝈", new DelegateHelper().GoodMorningByChinese); new DelegateHelper().GoodMorning("guoguo", new DelegateHelper().GoodMorningByEnglish); new DelegateHelper().GoodMorning("蝈蝈", delegate(string name) { Console.WriteLine("匿名方法,name=" + name); }); new DelegateHelper().GoodMorningByAction("【action】蝈蝈", new DelegateHelper().GoodMorningByChinese); new DelegateHelper().GoodMorningByAction("【action】guoguo", new DelegateHelper().GoodMorningByEnglish); new DelegateHelper().GoodMorningByAction("【action】蝈蝈", delegate(string name) { Console.WriteLine("匿名方法,name=" + name); }); Console.ReadKey(); } }
DelegateHelper.cs文件代码:
public delegate string SayHiEventHandler(string name); public delegate void GoodMorningEventHandler(string name); public class DelegateHelper { public void SayHi(string name,SayHiEventHandler sayHi) { sayHi(name); } //Func<string,string> func表示包含一个string参数、返回值为string类型的委托 //Func<>最后一个参数表示返回值类型,其他参数均为方法所需参数 //Func<string> func表示无参数、返回值为string类型的委托 public void SayHiByFunc(string name, Func<string, string> func) { func(name); } public void GoodMorning(string name, GoodMorningEventHandler morning) { morning(name); } //Action<string> action表示包含一个string参数、无返回值的委托, //Action action表示无参数、无返回值的委托 public void GoodMorningByAction(string name, Action<string> action) { action(name); } public string SayHiByEnglish(string name) { Console.WriteLine("Hello:" + name); return "success"; } public string SayHiByChinese(string name) { Console.WriteLine("你好:" + name); return "成功"; } public void GoodMorningByEnglish(string name) { Console.WriteLine("吃了吗:" + name); } public void GoodMorningByChinese(string name) { Console.WriteLine("Good Weather:" + name); } }