C# - “foreach”和扩展方法之间的区别:ForEach

时间:2014-01-08 22:35:11

标签: c# extension-methods

有人能指出C#语句与其类似扩展方法之间的差异吗?例如:foreach.ForEach(扩展方法)。

如果有任何差异,它们是什么?安全明智吗?表现明智吗?哪一个更好用?哪一个更安全?等

如果没有差异,为什么还要写它们?

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

2 个答案:

答案 0 :(得分:4)

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

在app加载和编译时加载扩展方法会有最小/可忽略的时间。将“.ForEach”语法转换为基础foreach的“May”是最小的开销,因为它在技术上只是一个包装器。它可能会导致安全问题,但仅仅是因为它可能会创建关闭位置,在此期间可能无法收集您的对象(例如:保持范围更长)。最终,差异非常小,而且归结为品味。当然,除非你试图每隔一毫秒削减一次,在这种情况下,使用原生身体是最好的方法。

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

请参阅: Why there is no ForEach extension method on IEnumerable?

这是一种权衡。扩展方法当然更简洁,它提供了编译时检查。扩展方法也会带来可读性,难以维护和副作用的困难。

取自here

  

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

     

foreach(foo foo in foos){声明涉及foo; }

     

进入此代码:

     

foos.ForEach((Foo foo)=> {声明涉及foo;});

     

使用几乎完全相同的字符略有不同   订购。然而第二个版本更难理解,更难   调试,并引入闭包语义,从而可能发生变化   以微妙的方式反对生命。

答案 1 :(得分:0)

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

一般情况下,如果我无意执行Parallel.ForEach,那么我更倾向于使用常规foreach来提高可读性。