c# - 在 C# 中这种委托(delegate)用法的名称是什么?

标签 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);
}

第一季度
Exec1() 方法演示了匿名委托(delegate)的使用,对吗?

第二季度
在 Exec2() 中,将 opener 被视为匿名委托(delegate)?它确实有一个名字。如果不是匿名委托(delegate),我应该怎么调用它?这种语法有名称吗? “命名匿名委托(delegate)?”持有匿名委托(delegate)的局部变量?

最佳答案

问题 1:没有“匿名委托(delegate)”这样的术语(在 C# 语言规范中)- 但它使用了 lambda expression这是一种匿名函数。有关详细信息,请参阅 C# 语言规范的第 7.14 节。

Q2:opener 是一个变量。该变量被分配一个使用 lambda 表达式创建的值。创建后,委托(delegate)只是 StreamOpenerDelegate 的一个实例。换句话说,lambda表达式、匿名函数和匿名方法的概念是源代码概念,而不是执行时间概念。 CLR 不关心您如何创建委托(delegate)。

顺便说一下,您的两个 lambda 表达式都可以更简洁地表达 - 更少的括号等:

void Exec1()
{
    WorkMethod(x => File.OpenRead(x));
}

void Exec2()
{
    StreamOpenerDelegate opener = x => File.OpenRead(x);
    WorkMethod(opener);
}

或者,您可以只使用方法组转换:

StreamOpenerDelegate opener = File.OpenRead;

关于c# - 在 C# 中这种委托(delegate)用法的名称是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1771109/

相关文章:

c# - 迭代面板控件

asp.net - 使用 Owin 时出现 Access-Control-Allow-Origin 错误

.net - ASP .NET - Eval() 背后发生了什么?

java - 值得信赖的开发人员撰写有关 Java 和 .NET 的文章?

c# - Lambda 表达式与匿名方法

C#:如何使用 LINQ 或 LAMBDA 表达式操作 List<String>

java - IntelliJ 和内置 Java 函数接口(interface)

c# - ViewBag 属性在单元测试中始终返回 null

c# - 为什么同样的 msdn C# 示例程序输出与我的不一样?

c# - 使用 msbuild 更改连接字符串