Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中使用委托的名称是什么?_C#_.net_Lambda_Delegates_Closures - Fatal编程技术网

在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() {

这是一个术语问题。在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()内部,将
打开程序
是否被视为匿名代表?它确实有一个名字。如果不是匿名委托,我该怎么称呼它?这个语法有名字吗?“命名匿名委托?”一个包含匿名委托的局部变量

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);
}
或者,您可以只使用方法组转换: