Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lambda表达式/委托是否为C;纯粹的;,或者他们可能是?_C#_.net_Functional Programming_Lambda - Fatal编程技术网

C# lambda表达式/委托是否为C;纯粹的;,或者他们可能是?

C# lambda表达式/委托是否为C;纯粹的;,或者他们可能是?,c#,.net,functional-programming,lambda,C#,.net,Functional Programming,Lambda,我了解了没有副作用的函数程序,并了解了这对于使并行任务变得简单意味着什么。具体来说,“纯”函数使这变得微不足道,因为它们没有副作用 我最近还研究了LINQ和lambda表达式,因为我在这里多次遇到涉及枚举的StackOverflow示例。这让我想知道,在C#now中,并行化枚举或循环是否“更容易” lambda表达式是否“纯净”到足以实现琐碎的并行化?也许这取决于你对这个表达式做了什么,但它们是否足够纯净呢?在C#中,这样的事情在理论上是可能的/微不足道的吗 将循环分解成块 运行一个线程来循环

我了解了没有副作用的函数程序,并了解了这对于使并行任务变得简单意味着什么。具体来说,“纯”函数使这变得微不足道,因为它们没有副作用

我最近还研究了LINQ和lambda表达式,因为我在这里多次遇到涉及枚举的StackOverflow示例。这让我想知道,在C#now中,并行化枚举或循环是否“更容易”

lambda表达式是否“纯净”到足以实现琐碎的并行化?也许这取决于你对这个表达式做了什么,但它们是否足够纯净呢?在C#中,这样的事情在理论上是可能的/微不足道的吗

  • 将循环分解成块
  • 运行一个线程来循环每个块
  • 运行一个函数,该函数使用 每个线程的当前环路位置
例如,假设我在一个游戏循环中有一堆对象(因为我正在开发一个游戏,并且正在考虑多个线程的可能性),并且必须在每一帧对它们中的每一个都做一些事情,那么上面提到的事情会不会很简单呢?从IEnumerable来看,它似乎只跟踪当前位置,因此我不确定是否可以使用普通的泛型集合将枚举分解为“块”

对不起,这个问题。我使用上面的项目符号而不是伪代码,因为我甚至不知道如何从头顶上写下伪代码。我的.NET知识纯粹是简单的业务知识,我对代理和线程等都是新手。我主要想知道上述方法是否适合进行研究,以及代理/Lambda在并行化方面是否不必担心。

Lambda应该是纯的。然后,该框架通过在LINQ查询(PLINQ)中添加一个简单的
.aspallel
,提供了自动并行化


但是它不是自动的或保证的,程序员有责任使它们保持纯净。

lambda是否纯净取决于它在做什么。作为一个概念,它既不纯粹也不不纯

例如:以下lambda表达式是不纯的,因为它在主体中读取和写入单个变量。并行运行会创建竞争条件

var i = 0;
Func<bool> del = () => {
  if ( i == 42 ) { return true; }
  else ( i++ ) { return false; }
};
var i=0;
Func del=()=>{
如果(i==42){返回true;}
else(i++){return false;}
};
相反,下面的委托是纯的,没有竞争条件

Func<bool> del = () => true;
Func del=()=>true;

至于循环部分,您也可以使用
Parallel.for
Parallel.ForEach
作为关于游戏中对象的示例。这也是.net 4的一部分,但您可以下载它。

首先,请注意,为了“纯粹”,一种方法不仅必须没有副作用。当给定相同的参数时,它还必须始终返回相同的结果。例如,“Math.Sin”方法是纯粹的。你在12岁时进食,它会给你带来罪恶(12),每次都是一样的。方法GetCurrentTime()即使没有副作用也不是纯粹的;无论传入什么参数,每次调用时它都返回不同的值

还要注意,纯方法确实不应该抛出异常;出于我们的目的,异常被视为可观察到的副作用

第二,是的,如果你能对一个方法的纯度进行推理,那么你就可以做一些有趣的事情来自动将它并行化。问题是,几乎没有一种方法是纯粹的。此外,假设你有一个纯方法;由于纯方法是记忆化的完美候选者,而且由于记忆化会带来副作用(它会使缓存发生变异!),因此,采用本应是纯方法的方法,然后使其变得不纯净,这是非常有吸引力的

正如乔·达菲所说,我们真正需要的是某种“抑制副作用”的方法。在一个方法周围画一个框,说“这个方法不是没有副作用的,但是它的副作用在框外是看不见的”,然后利用这个事实来驱动安全的自动并行化


我很想找到一些方法,将这些概念添加到像C#这样的语言中,但这里的问题完全是空中楼阁的开放式研究问题;没有意图或暗示的承诺。

有一篇13部分的文章讨论了.NET 4.0中新的并行性支持。第7部分还包括对LINQ和PLINQ的讨论。这是一本很好的读物,所以请查看它

AsParallel?那是什么?C#4?还是单独下载?是的,对不起。PLINQ是.NET4的一部分,3.5+1函数式编程也有一个版本(beta?),它赋予程序员更多的责任。识别可以并行执行的代码块就是其中之一。出于好奇,如果你试图运行不完全使用“AsParallel”的代码,会发生什么情况?@Joan:常见的东西:竞争条件