Kia*_*Rad 4 c# foreach extension-methods loops
谁能指出C#语句及其类似扩展方法之间的区别?例如:foreachvs. .ForEach(扩展方法)。
如果有任何区别,它们是什么?安全明智吗?性能明智?哪个更好用?哪个更安全?等等。
如果没有差异,那为什么还要写它们呢?
如果我的问题没有找到我的答案,我一直在思考和搜索这个问题。
这取决于您使用的扩展方法的实现。在内部,大多数版本的 .ForEach 确实没有什么特别之处。
在应用程序加载和编译时加载扩展方法的时间最少/可以忽略不计。将 .ForEach 语法转换为底层 foreach 的开销“可能”很小,因为它在技术上只是一个包装器。它可能会导致安全问题,但仅仅是因为它会创建闭包情况,在这种情况下,您的对象可能无法在预期的时间被收集(例如:在范围内持有更长时间)。最终,差异非常非常小,归结为口味。当然,除非你试图每毫秒都刮掉一次,在这种情况下,使用原生 body 是最好的方法。
我想提一下,.ForEach 违背了使用 lambda 语句是纯函数式的前提,即它打破了“函数式”风格并引入了副作用的可能性。使用 foreach 主体使代码更具可读性和明确性。
请参阅: 为什么 IEnumerable 上没有 ForEach 扩展方法?
这是一种权衡。扩展方法当然更简洁,它提供了编译时检查。扩展方法还会引入可读性困难、可维护性困难和副作用。
取自这里
第二个原因是这样做为语言增加了零新的表征能力。这样做可以让你重写这段非常清晰的代码:
foreach(Foo foo in foos){ 涉及 foo 的语句;}
进入这个代码:
foos.ForEach((Foo foo)=>{ 涉及 foo 的语句; });
它以略有不同的顺序使用几乎完全相同的字符。然而,第二个版本更难理解,更难调试,并引入了闭包语义,从而可能以微妙的方式改变对象的生命周期。