这是一个术语问题。在C#中,我可以这样做:
delegate Stream StreamOpenerDelegate(String name);
void WorkMethod(StreamOpenerDelegate d)
{
// ...
}
void Exec1()
{
WorkMethod((x) =>
{
return File.OpenRead(x);
});
}
void Exec2()
{
StreamOpenerDelegate opener = (x) =>
{
return File.OpenRead(x);
};
WorkMethod(opener);
}
Q1
Exec1()方法演示了如何使用匿名委托,对吗?
Q2
在Exec2()内部,opener
被视为匿名代表? 有一个名字。如果它不是匿名代表,我该怎么称呼它?这个语法有名称吗? “命名为匿名代表?”一个持有匿名代表的局部变量?
答案 0 :(得分:15)
Q1:没有“匿名委托”这样的术语(在C#语言规范中) - 但这使用lambda expression这是一种匿名函数。有关详细信息,请参阅C#语言规范的第7.14节。
Q2:opener
是一个变量。为变量分配使用lambda表达式创建的值。创建后,委托只是StreamOpenerDelegate
的一个实例。换句话说,lambda表达式,匿名函数和匿名方法的概念是源代码概念,而不是执行时间概念。 CLR并不关心您如何创建委托。
顺便说一下,你的两个lambda表达式都可以更简洁地表达 - 更少的括号等:
void Exec1()
{
WorkMethod(x => File.OpenRead(x));
}
void Exec2()
{
StreamOpenerDelegate opener = x => File.OpenRead(x);
WorkMethod(opener);
}
或者您可以使用方法组转换:
StreamOpenerDelegate opener = File.OpenRead;
答案 1 :(得分:10)
不,不。
A1 :此功能是C#3.0的新功能,称为 lambda表达式。 C#2.0有一个类似的功能叫做匿名方法;例如:
button.Click += delegate {
//code
};
A2 :opener
是一个碰巧拥有lambda表达式的常规变量。
顺便说一下,只需要一个参数的lambda表达式就不需要括号。另外,只包含return语句的lambda表达式不需要大括号。
例如:
StreamOpenerDelegate opener = x => File.OpenRead(x);