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