C#Lambda表达式:为什么我应该使用它们?

我已经快速阅读了Microsoft Lambda Expression文档。

虽然这样的例子帮助我更好地理解:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

不过,我不明白为什么这是一种创新。 这只是一个方法,当“方法变量”结束时就会死掉,对吗? 为什么我应该使用这个而不是真正的方法?


Lambda表达式对于匿名代理来说是一种更简单的语法,可以在任何地方使用匿名代理。 然而,事实恰恰相反, lambda表达式可以转换为表达式树,从而允许LINQ to SQL等许多魔术。

以下是LINQ to Objects表达式的一个例子,它使用匿名委托,然后使用lambda表达式来展示他们的眼睛有多容易:

// anonymous delegate
var evens = Enumerable
                .Range(1, 100)
                .Where(delegate(int x) { return (x % 2) == 0; })
                .ToList();

// lambda expression
var evens = Enumerable
                .Range(1, 100)
                .Where(x => (x % 2) == 0)
                .ToList();

Lambda表达式和匿名委托相对于编写单独的函数具有优势:它们实现了闭包,它允许您将本地状态传递给函数,而无需向函数添加参数或创建一次性使用的对象。

表达式树是C#3.0的一个非常强大的新功能,它允许API查看表达式的结构,而不是仅仅获取对可执行方法的引用。 API只需将一个委托参数放入一个Expression<T>参数中,编译器将从一个lambda生成一个表达式树,而不是一个匿名委托:

void Example(Predicate<int> aDelegate);

称为:

Example(x => x > 5);

变为:

void Example(Expression<Predicate<int>> expressionTree);

后者将通过描述表达式x > 5的抽象语法树的表示。 LINQ to SQL依靠此行为可以将C#表达式转换为服务器端的过滤/排序等所需的SQL表达式。


匿名函数和表达式对于一次性方法非常有用,它不会从创建完整方法所需的额外工作中受益。

考虑这个例子:

 string person = people.Find(person => person.Contains("Joe"));

 public string FindPerson(string nameContains, List<string> persons)
 {
     foreach (string person in persons)
         if (person.Contains(nameContains))
             return person;
     return null;
 }

这些在功能上是等同的。


当我想使用另一个控件声明某个控件事件的处理程序时,我发现它们非常有用。 要做到这一点,通常你必须在类的字段中存储控件的引用,这样你就可以用不同的方法使用它们。

private ComboBox combo;
private Label label;

public CreateControls()
{
    combo = new ComboBox();
    label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += new EventHandler(combo_SelectedIndexChanged);
}

void combo_SelectedIndexChanged(object sender, EventArgs e)
{
    label.Text = combo.SelectedValue;
}

感谢lambda表达式,你可以像这样使用它:

public CreateControls()
{
    ComboBox combo = new ComboBox();
    Label label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += (s, e) => {label.Text = combo.SelectedValue;};
}

更容易。

链接地址: http://www.djcxy.com/p/51433.html

上一篇: C# Lambda expressions: Why should I use them?

下一篇: jQuery Event Keypress: Which key was pressed?