0

この種のコードを考えてみましょう:

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

関数をそのように使用したいよりも:

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

問題は、コンパイラが関数の結果をキャッシュして、1 回だけ計算されるようにするかどうかです。それとも2回計算されますか?答えをグーグルで検索しようとしましたが、うまくいきませんでした。

クロージャのキャッシュについてはどうでしょうか。

4

3 に答える 3

2

関数は 2 回実行されます。関数の結果が 2 回目に同じになるかどうかをコンパイラ/ランタイムが知る方法はありません。それが関数の目的の機能である場合は、値を自分でキャッシュする必要があります。

この場合、関数が生成するすべての結果をキャッシュするよりも、関数の結果を変数として保存して検証してから使用できるようにする方がよいでしょう。

ラムダ、クロージャーなどを使用しても、上記のステートメントは変更されません。

于 2013-06-17T14:16:45.580 に答える
0

結果はキャッシュされません。デリゲートを呼び出すたびに計算が実行されます。

于 2013-06-17T14:18:08.200 に答える
0

ここでは、C# コンパイラは結果をキャッシュしません。JITも一般的には期待していません。もちろん、ローカル変数を使用するだけで、ローカルベースで非常に簡単に行うことができます。結果がよりグローバルにキャッシュされるように、クロージャー自体に適用する小さなメモ化メソッドを作成することもできますが、それをどのように使用するかについて注意する必要があります。

C# コンパイラは、特定の状況でラムダ式自体をキャッシュできますが、これは実装の詳細です。特に、変数 ( を含む) をキャプチャしないラムダ式はthis、Microsoft の実装によってキャッシュされると思います。

于 2013-06-17T14:16:51.060 に答える