在C#中使用委托的名称是什么?
这是一个术语问题。在C#中,我可以这样做:在C#中使用委托的名称是什么?,c#,.net,lambda,delegates,closures,C#,.net,Lambda,Delegates,Closures,这是一个术语问题。在C#中,我可以这样做: delegate Stream StreamOpenerDelegate(String name); void WorkMethod(StreamOpenerDelegate d) { // ... } void Exec1() { WorkMethod((x) => { return File.OpenRead(x); }); } void Exec2() {
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);
}
Q1Exec1()方法演示了匿名委托的使用,对吗 Q2
在Exec2()内部,将
打开程序
是否被视为匿名代表?它确实有一个名字。如果不是匿名委托,我该怎么称呼它?这个语法有名字吗?“命名匿名委托?”一个包含匿名委托的局部变量 No和No
A1:此功能是C#3.0的新功能,称为lambda表达式。C#2.0有一个类似的特性,称为匿名方法;例如:
button.Click += delegate {
//code
};
StreamOpenerDelegate opener = x => File.OpenRead(x);
A2:opener
是一个正则变量,恰好包含lambda表达式
顺便说一下,只接受一个参数的lambda表达式不需要括号。另外,只包含return语句的lambda表达式不需要大括号
例如:
button.Click += delegate {
//code
};
StreamOpenerDelegate opener = x => File.OpenRead(x);
Q1:没有“匿名委托”这样的术语(在C#语言规范中),但它使用的是一种匿名函数。详见C语言规范第7.14节 问题2:
开场白
是一个变量。为变量分配一个使用lambda表达式创建的值。创建委托后,该委托只是StreamOpenerDelegate
的一个实例。换句话说,lambda表达式、匿名函数和匿名方法的概念是源代码概念,而不是执行时间概念。CLR不关心您如何创建委托
顺便说一句,两个lambda表达式都可以更简洁地表达-更少的括号等:
void Exec1()
{
WorkMethod(x => File.OpenRead(x));
}
void Exec2()
{
StreamOpenerDelegate opener = x => File.OpenRead(x);
WorkMethod(opener);
}
或者,您可以只使用方法组转换: