c# - 使用委托(delegate)表示法访问通用列表

标签 c# .net generics

我看到有人写:

//wordList is List<string> 
wordList.ForEach(delegate(string word){ Console.WriteLine(word);});

代替:

foreach(string word in wordList)
{
    Console.WriteLine(word);
}

这样做有什么好处。尽管我在 C# 2.0 中使用过委托(delegate),但我也无法理解上面给出的 Action 委托(delegate)语法。基本上我无法将语法与我熟悉的委托(delegate)概念联系起来。 你能帮我理解语法吗?是简写吗?

最佳答案

delegate() {...}语法在 .NET 2 中可用。它实质上是在包含委托(delegate)内容的包含类中创建一个(匿名)方法。所以,上面的语法等同于

private void actionImpl(string word) {
    Console.WriteLine(word);
}

wordList.ForEach(new Action<string>(actionImpl));

关于 List<T>.ForEach , Eric Lippert has blogged about this .当一个 Action 没有副作用并且是一个非常简单的单行时,它很有用。使用隐式委托(delegate)创建和方法组,您可以将代码示例缩减为

wordList.ForEach(Console.WriteLine);

作为Console.WriteLine(string s)匹配Action<string>代表签名。这比使用显式 foreach 代码更少,而且(我认为)更清晰循环,在这个特定的例子中。

关于c# - 使用委托(delegate)表示法访问通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526587/

相关文章:

c# - IList<T> 与 Collection<T> 作为属性

c# - 将 native DLL 路径添加到托管控制台应用程序

swift - 如何克服“"Generic parameter ' T' is not used in function signature”的错误?

c# - 如何检查应用程序是否从\program files\运行

C# MemoryStream 在处理/关闭/等之后泄漏内存?

.net - 如何从另一个项目中引用 ASP.NET 5 项目?

c# - 如何在 C# 泛型中指定可以从字符串构造的 T ? (通用类型约束)

c# - 如何比较两个通用对象与嵌套集合

java - 使用基本页面对象扩展可加载组件

c# - 使用 REST 和 C# 实现 Google transliterate API,面临 unicode 和解析问题