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