gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:49:18 24 4
gpt4 key购买 nike

这是一个术语问题。在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com