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