0

让我们有这样的代码:

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

比我想那样使用我的功能:

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

问题是编译器是否缓存了函数结果,所以它只会计算一次?还是会计算两次?试图用谷歌搜索答案,但没有运气。

那么缓存闭包呢?

4

3 回答 3

2

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

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

使用 lambda、闭包等不会改变上述任何语句。

于 2013-06-17T14:16:45.580 回答
0

C# 编译器不会在此处缓存结果。我也不指望 JIT 通常会这样。当然,您可以很容易地在本地自己完成,只需使用局部变量即可。您还可以编写一个小的 memoization 方法来应用到闭包本身,这样结果就可以更全局地缓存 - 但您需要注意如何使用它。

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

于 2013-06-17T14:16:51.060 回答
0

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

于 2013-06-17T14:18:08.200 回答