C#之委托(二)
其实在上一篇委托(一)中,创建委托还是太繁琐了点。代码量过多,可能会妨碍我们对代码和逻辑的理解。有些时候可能处理逻辑的代码都笔声明委托的代码要少,这就不可避免的增加了重复代码的量。所以在c#2中极大的简化了这种方法,在C#3中也出现了Lambda表达式来解决这种问题。我们先看一下最开始的的委托。
private void Form1_Load(object sender, EventArgs e) { button1.Click += new EventHandler(LogPlainEvent); button1.KeyPress += new KeyPressEventHandler(LogKeyEvent); button1.MouseClick += new MouseEventHandler(LogMouseEvent); } static void LogPlainEvent(object sender, EventArgs e) { Console.WriteLine("LogPlain!"); } static void LogKeyEvent(object sender, KeyPressEventArgs e) { Console.WriteLine("LogKey"); } static void LogMouseEvent(object sender, MouseEventArgs e) { Console.WriteLine("LogMouse"); }
在winform中添加如下的代码,其实就是给按钮添加点击事件,press事件和鼠标连续点击事件。
我们在订阅事件的时候,都需要是使用new KeyPerssEvetHandler(LogKey),但c#2支持从方法组到兼容委托的一个隐试转化。其实方法组就是直接使用方法名而已。
button1.Click += LogPlainEvent; button1.KeyPress += LogKeyEvent; button1.MouseClick += LogMouseEvent;这样的话就不需要每次都实例化一个委托实例。简化了一部分的代码。
匿名函数
当然做一件非常小的事,但也必须创建一个完整的委托,代码量的上升和对智能提示的干扰也是不能让开发人员集中精力在业务逻辑上的重要原因。所以在c#2.0中引入了匿名函数的概念。就是为了解决这个情况。
首先还是来看看匿名函数用于委托的基本语法吧。
Action<string> printReverse = new Action<string>(delegate(string text) { char[] chars = text.ToCharArray(); Array.Reverse(chars); Console.WriteLine(new String(chars)); }); printReverse("shaoqi");其实就是编译器在IL的语言里面生成了一个创建了一个委托。这样有些重复的代码编译器就替你做好了。可以让你的精力集中在代码的逻辑上面。
Lambda表达式
然后在C#3.0中出项了Lambda表达式,在一定程度上可以看作是匿名函数的一种演变。Lambda比匿名函数感觉的易读和紧凑。需要注意的一点是Lambda表达式本身并不是委托的类型,但可以通过隐式转换的方式转换成一个委托。然后来看看Lambda表的演变。
第一个是通过匿名函数创建委托。第二个就是lambda创建的委托。Func<string, int> returnLength; returnLength = delegate(string text) { return text.Length; }; returnLength = (string text) => { return text.Length; }; returnLength = (string text) => text.Length; returnLength = (text) => text.Length;//隐式推断出 returnLength = text => text.Length;
下一次会写关于LINQ和表达树的知识。自己总结一下。