C#foreach vs functional each

wha*_*ave 19 c# functional-programming

您更喜欢哪一种?

foreach(var zombie in zombies)
{
    zombie.ShuffleTowardsSurvivors();
    zombie.EatNearbyBrains();
}
Run Code Online (Sandbox Code Playgroud)

要么

zombies.Each(zombie => {
    zombie.ShuffleTowardsSurvivors();
    zombie.EatNearbyBrains();
});
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 26

首先.出于某种原因,它是语言的一部分.

就个人而言,如果有充分的理由,我只会使用第二种功能方法进行流量控制,例如Parallel.ForEach在.NET 4中使用.它有许多缺点,包括:

  • 它慢了.它将在每个元素上引入一个委托调用,就像你一样foreach (..) { myDelegate(); }
  • 这是非标准的,因此大多数开发人员都会更难理解
  • 如果你关闭任何本地人,你将迫使编译器进行关闭.如果涉及线程,这可能会导致奇怪的问题,并且会给程序集增加完全不必要的膨胀.

我认为没有理由为语言中已存在的流控制结构编写自己的语法.


Gre*_*ech 10

在这里你做了一些非常必要的事情,比如写一个语句而不是一个表达式(假设这个Each方法没有返回任何值)和变异状态(一个人只能假设方法这样做,因为它们似乎也没有返回任何值)但是你通过将一组语句作为委托传递,试图将它们作为'函数式编程'传递出去.这段代码几乎不能远离函数式编程的理想和习惯,那么为什么要试着把它伪装成这样呢?

尽管我喜欢C#这样的多范式语言,但我认为当范式在更高层次上混合时(例如,以功能或命令式编写的整个方法)而不是多个范例时,它们最容易理解和维护.在单个语句或表达式中混合使用.

如果您正在编写命令式代码,请诚实地使用它并使用循环.没什么值得羞耻的.命令式代码本质上不是坏事.


小智 5

第二种形式.

在我看来,你必须使用的语言结构和关键词越少越好.C#中有足够多的外来瑕疵.

通常,您输入的越少越好.说真的,你怎么不想在这样的情况下使用"var"?当然,如果明确是你唯一的目标,你仍然会使用匈牙利表示法...你有一个IDE,当你将鼠标悬停在你身上时会给你输入类型信息......当然,如果你使用的是Resharper,还是按Ctrl + Q. .

@TED委托调用的性能影响是次要问题.如果你这样做了一千个条款肯定,运行点跟踪,看看它是否不可接受.

@Reed Copsey:非标准,如果开发人员无法解决".每个"正在做什么,那么你会遇到更多问题,呵呵.破解语言以使其更好是编程的一大乐趣.