我已经快速阅读了Microsoft Lambda表达式文档。
不过,这样的例子帮助我更好地理解:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
不过,我还是不明白为什么这是一种创新。它只是一个在“方法变量”结束时死亡的方法,对吧?为什么我要用这个而不是真正的方法?
我已经快速阅读了Microsoft Lambda表达式文档。
不过,这样的例子帮助我更好地理解:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
不过,我还是不明白为什么这是一种创新。它只是一个在“方法变量”结束时死亡的方法,对吧?为什么我要用这个而不是真正的方法?
当前回答
Lambda清理了c# 2.0的匿名委托语法…例如
Strings.Find(s => s == "hello");
在c# 2.0中是这样完成的:
Strings.Find(delegate(String s) { return s == "hello"; });
在功能上,它们做的是完全相同的事情,只是语法更简洁。
其他回答
匿名函数和表达式对于一次性方法非常有用,这些方法不需要从创建完整方法所需的额外工作中获益。
想想这个例子:
List<string> people = new List<string> { "name1", "name2", "joe", "another name", "etc" };
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;
}
它们在功能上是等价的。
在c#中,我们不能像在JavaScript中那样将函数作为参数传递。解决方法是使用委托。
当我们想参数化行为而不是值时,我们使用委托。Lambdas是编写委托的实用语法,可以很容易地将行为作为函数传递。
Lambda表达式是表示匿名方法的一种简洁方式。匿名方法和Lambda表达式都允许您内联定义方法实现,但是,匿名方法显式地要求您定义方法的参数类型和返回类型。Lambda表达式使用c# 3.0的类型推断特性,该特性允许编译器根据上下文推断变量的类型。这是非常方便的,因为这节省了我们大量的输入!
这只是使用lambda表达式的一种方式。你可以在任何可以使用委托的地方使用lambda表达式。这允许你做这样的事情:
List<string> strings = new List<string>();
strings.Add("Good");
strings.Add("Morning")
strings.Add("Starshine");
strings.Add("The");
strings.Add("Earth");
strings.Add("says");
strings.Add("hello");
strings.Find(s => s == "hello");
这段代码将在列表中搜索与单词“hello”匹配的条目。另一种方法是传递一个委托给Find方法,像这样:
List<string> strings = new List<string>();
strings.Add("Good");
strings.Add("Morning")
strings.Add("Starshine");
strings.Add("The");
strings.Add("Earth");
strings.Add("says");
strings.Add("hello");
private static bool FindHello(String s)
{
return s == "hello";
}
strings.Find(FindHello);
编辑:
在c# 2.0中,这可以使用匿名委托语法完成:
strings.Find(delegate(String s) { return s == "hello"; });
Lambda明显地清理了语法。
当我想使用另一个控件为某个控件的事件声明一个处理程序时,我发现它们很有用。 要做到这一点,你必须将控件的引用存储在类的字段中,这样你就可以在不同的方法中使用它们。
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;};
}
容易得多。