c#上的缓存函数结果

时间:2013-06-17 14:12:32

标签: c# caching functional-programming clr

让我们有这样的代码:

 Function<int,int> someFunc=(x)=>{
 //SomeCalc
 return y;
 }

比我想以这样的方式使用我的功能:

 int result;
 if(someFunc(k)!=0)
 {
 result=someFunc(k);
 }

问题是编译器是否缓存了函数结果,因此只计算一次?或者它将被计算两次?试图谷歌答案,但没有运气。

那么关闭缓存呢?

3 个答案:

答案 0 :(得分:2)

该功能将执行两次。编译器/运行时无法知道函数的结果是否第二次相同。如果这是函数所需的功能,则需要自己缓存该值。

在这种情况下,虽然你最好只将函数的结果存储为变量,以便你可以验证它然后使用它,而不是让函数缓存它生成的所有结果。

使用lambdas,闭包等不会改变上述任何陈述。

答案 1 :(得分:0)

C#编译器不会在此处缓存结果。我也不希望JIT一般。当然,只需使用局部变量,您就可以非常轻松地在本地进行。您还可以编写一个小的memoization方法来应用于闭包本身,以便结果更全局地缓存 - 但是您需要注意如何使用它。

C#编译器可以在某些情况下缓存lambda表达式本身,但它是一个实现细节。特别是,我相信任何不捕获任何变量(包括this)的lambda表达式都会被Microsoft实现缓存。

答案 2 :(得分:0)

结果未缓存。每次调用代理人时都会执行计算。