在C#中使用委托的名称是什么?

时间:2009-11-20 15:15:13

标签: 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()
{
    StreamOpenerDelegate opener = (x) =>
        {
            return File.OpenRead(x);
        };

    WorkMethod(opener);
}

Q1
Exec1()方法演示了如何使用匿名委托,对吗?

Q2
在Exec2()内部,opener 被视为匿名代表 有一个名字。如果它不是匿名代表,我该怎么称呼它?这个语法有名称吗? “命名为匿名代表?”一个持有匿名代表的局部变量?

2 个答案:

答案 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);