让我们有这样的代码:
Function<int,int> someFunc=(x)=>{
//SomeCalc
return y;
}
比我想以这样的方式使用我的功能:
int result;
if(someFunc(k)!=0)
{
result=someFunc(k);
}
问题是编译器是否缓存了函数结果,因此只计算一次?或者它将被计算两次?试图谷歌答案,但没有运气。
那么关闭缓存呢?
答案 0 :(得分:2)
该功能将执行两次。编译器/运行时无法知道函数的结果是否第二次相同。如果这是函数所需的功能,则需要自己缓存该值。
在这种情况下,虽然你最好只将函数的结果存储为变量,以便你可以验证它然后使用它,而不是让函数缓存它生成的所有结果。
使用lambdas,闭包等不会改变上述任何陈述。
答案 1 :(得分:0)
C#编译器不会在此处缓存结果。我也不希望JIT一般。当然,只需使用局部变量,您就可以非常轻松地在本地进行。您还可以编写一个小的memoization方法来应用于闭包本身,以便结果更全局地缓存 - 但是您需要注意如何使用它。
C#编译器可以在某些情况下缓存lambda表达式本身,但它是一个实现细节。特别是,我相信任何不捕获任何变量(包括this
)的lambda表达式都会被Microsoft实现缓存。
答案 2 :(得分:0)
结果未缓存。每次调用代理人时都会执行计算。