首页 > 代码库 > c# 匿名函数与委托
c# 匿名函数与委托
在 2.0之前的 C#版本中,声明委托的唯一方法是使用命名方法。 C# 2.0引入了匿名方法,而在 C# 3.0及更高版本中,Lambda表达式取代了匿名方法,作为编写内联代码的首选方式。不过,本主题中有关匿名方法的信息同样也适用于 Lambda表达式。有一种情况下,匿名方法提供了 Lambda表达式中所没有的功能。可使用匿名方法来忽略参数列表。这意味着匿名方法可转换为具有各种签名的委托。这对于 Lambda表达式来说是不可能的。有关 lambda表达式的更多特定信息,参看MSDN
//匿名函数 var p1=new{Name="张三",Age=28}; var p2=new{Name="李四",Age=29}; var intArr=new[]{1,2,3,4,5};
首先我们来看一下上面这段代码,比较简单,和我们平时定义一个实例基本没什么区别,只是new后面没有跟具体定义的类型;这里我们使用new关键字调用匿名初始化器创建了一个匿名类型对象;匿名类型直接继承自System.Object;匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。
这里我们注意到C#匿名函数基本上是配合隐式类型var来使用的,而且定义的顺序也是一定要注意,上面p1和p2初始化时定义的属性名、类型和顺序一致,因此编译器认为他们是同一个类型,可以使用p1=p2这样的赋值语句;特别是顺序需要注意,如果初始化时名称类型一致而顺序不一致,则p1和p2就是两个类型,如果使用p1=p2则编译时会抛出错误:无法将类型“AnonymousType#1”隐式转换为“AnonymousType#2” .定义匿名函数时还需要注意,不能用null赋初始值。
下面我们看例子
1 匿名函数与委托绑定
在事件中使用匿名方法
以下是一个定时器的小例子,我们常规的命名写法如下:
class EventTest { public void Test() { System.Timers.Timer timersTimer =new System.Timers.Timer(); timersTimer.Enabled = true; timersTimer.Interval = 5000; timersTimer.Elapsed += newSystem.Timers.ElapsedEventHandler(timersTimer_Elapsed); Console.ReadLine(); } void timersTimer_Elapsed(object sender,System.Timers.ElapsedEventArgs e) { Console.WriteLine(System.DateTime.Now); } }
对于事件的处理我们需要单独写一个方法timersTimer_Elapsed,那么如果使用匿名方法,则就可以省掉这个方法的定义,如下所示:
class EventTest { public void Test() { System.Timers.Timer timersTimer =new System.Timers.Timer(); timersTimer.Enabled = true; timersTimer.Interval = 5000; timersTimer.Elapsed += delegate(object sender,System.Timers.ElapsedEventArgs e) { Console.WriteLine(System.DateTime.Now); }; Console.ReadLine(); } }
也就是把方法的实现直接写在内部。
2 匿名方法内部直接取得当前调用者的变量
- 使委托与匿名方法关联。
- 使委托与命名方法(DoWork)关联。
delegate void Printer(string s); class TestClass { static void Main() { //1.使委托与匿名方法关联. Printer p = delegate(string j) { System.Console.WriteLine(j); }; p("The delegate using the anonymous method is called."); //2.使委托与命名方法 (DoWork) 关联。 p = new Printer(TestClass.DoWork); p("The delegate using the named method is called."); } static void DoWork(string k) { System.Console.WriteLine(k); } } /* Output: The delegate using the anonymous method is called. The delegate using the named method is called. */
当然代码虽然看起来很少,实际上编译器在编译时还是会生成其他方法的。也就是说匿名方法可以减少代码量,
节省开发时间,但是对于性能方法没有什么提升的。
小结:通过实例认识到,匿名函数可以简化代码,但是这个度还要根据自己的水平来判定,不然出了错误真是一个
很难的点。其次匿名函数在编译中并没有简化代码量,在生成时后台会生成一个类以及类似的方法。但是你若要
将代码传递为委托参数,创建匿名方法则是唯一的方法。下篇Lambda表达式