C#-之间的差异;foreach“;扩展方法:ForEach

C#-之间的差异;foreach“;扩展方法:ForEach,c#,extension-methods,C#,Extension Methods,有谁能指出C#语句和它们相似的扩展方法之间的区别吗?e、 g:foreach与.foreach(扩展方法) 如果有任何差异,它们是什么?安全方面?性能方面?哪一个更好用?哪个更安全?等等 如果没有区别,那为什么还要费心去写呢 我一直在思考和搜索这个问题,如果我的问题没有找到我的答案。这取决于您使用的扩展方法的实现。在内部,most版本的.ForEach并没有什么特别之处 在应用程序加载和编译时加载扩展方法的时间最短/可忽略。将.ForEach语法转换为基础ForEach“可能”有最小的开销,因为

有谁能指出
C#
语句和它们相似的扩展方法之间的区别吗?e、 g:
foreach
.foreach
(扩展方法)

如果有任何差异,它们是什么?安全方面?性能方面?哪一个更好用?哪个更安全?等等


如果没有区别,那为什么还要费心去写呢


我一直在思考和搜索这个问题,如果我的问题没有找到我的答案。

这取决于您使用的扩展方法的实现。在内部,most版本的.ForEach并没有什么特别之处

在应用程序加载和编译时加载扩展方法的时间最短/可忽略。将.ForEach语法转换为基础ForEach“可能”有最小的开销,因为从技术上讲它只是一个包装器。它可能会导致安全问题,但这仅仅是因为它会创建关闭位置,在该位置,您的对象可能无法在预期的时间收集(例如:在范围内保留更长时间)。归根结底,两者之间的差别非常非常小,归根结底取决于味道。当然,除非你试图每毫秒剃掉一次,在这种情况下,使用原生体是最好的方法

我想提到的是,.ForEach反对使用lambda语句纯粹是功能性的前提,也就是说,它打破了“功能性”风格,并引入了副作用的可能性。使用foreach主体使代码更具可读性和明确性

请参阅:

这是一种交换。扩展方法当然更简洁,它提供编译时检查。扩展方法还可能带来可读性困难、可维护性困难和副作用

取自

第二个原因是这样做不会增加新的代表性 语言的力量。这样做可以让您完美地重写它 明确代码:

foreach(Foo-Foo-in-foos){涉及Foo的语句;}

在此代码中:

ForEach((Foo-Foo)=>{涉及Foo的语句;})

它使用几乎完全相同的字符,但有点不同 秩序。然而,第二个版本更难理解,更难理解 调试,并引入闭包语义,从而可能改变 对象生命周期以微妙的方式


.ForEach
类似于
Parallel.ForEach
。我以前见过用于开发/调试并行版本的常规
.ForEach
。它的好处是,您不必更改一堆代码来在两者之间移动


一般来说,如果我不打算使用
Parallel.ForEach
,那么为了可读性,我更喜欢使用常规的
ForEach

请注意,tehre不是框架中的“ForEach”扩展方法,最接近的是
列表。ForEach
(已从Windows应用商店API中删除)真的没有比这个人自己更好的解释了。“如果没有区别,那为什么还要费心写呢?”这是一个极好的问题!我希望我有一个好的答案。lambda语法中没有纯洁性的前提。@Lee,纯洁性在“纯功能”的意义上。我将进行编辑。我是说lambda不是“纯粹的功能”,它们是匿名方法的简写,因此允许副作用。Linq本身促进纯度,它经常与lambdas一起使用,但lambdas本身却没有。@Lee,我不得不承认,你是对的。然而,这正是MS决定不在标准库中包含此功能的精神所在。所有标准运算符都旨在以功能性的方式使用,不过如果您愿意,当然可以打破这种模式。我确实希望包括这一点,但我不知道如何在不偏离我试图表达的观点的情况下进行修改。建议?