有人能指出C#
语句与其类似扩展方法之间的差异吗?例如:foreach
与.ForEach
(扩展方法)。
如果有任何差异,它们是什么?安全明智吗?表现明智吗?哪一个更好用?哪一个更安全?等
如果没有差异,为什么还要写它们?
我一直在思考和搜索这个问题,如果我的,并没有找到我的答案。
答案 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)
.ForEach
与Parallel.ForEach
类似。我以前见过用于开发/调试并行版本的常规.ForEach
。最好的是你不必改变一堆代码来在两者之间移动。
一般情况下,如果我无意执行Parallel.ForEach
,那么我更倾向于使用常规foreach
来提高可读性。