Lambda表達式是由匿名方法演化而來的更加高級的形式。關於匿名方法,請參閱http://msdn.microsoft.com/msdnmag/issues/04/05/C20/。關於Lambda表達式的演化,請參閱http://msdn.microsoft.com/msdnmag/issues/07/06/csharp30/default.ASPx?loc=zh。英文原版為http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/。
1,Lambda表達式中的lifting
在c# 2.0中,匿名方法的使用,是這樣的。
class SomeClass
{
delegate void SomeDelegate();
public void InvokeMethod()
{
SomeDelegate del = delegate()
{
MessageBox.Show("Hello");
};
del();
}
}
在LINQ 的演變及其對 C# 設計的影響 一文中,其斷言如果 lambda 表達式首先被引入語言,那麼就不會有對匿名方法的需要了。在本系列前面的一些文章中,也曾提到lambda 表達式,但並沒有做太深入的引述。本文所要講的是Lambda表達式中lifting,將開始和大家體會lambda表達式的一些細節。
編譯下面的小程序,看看輸出結果,是不是大吃一驚
using System;
using System.Collections.Generic;
using System.Linq;
namespace Tester
{
class Program
{
static void Main(string[] args)
{
List<Func<int>> list = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{
list.Add(() => i);
}
foreach (var item in list)
{
Console.WriteLine(item());
}
}
}
}