C#のstaticラムダ式
C#のラムダ式にstaticを付けると、外側のローカル変数やメソッド引数、thisなどを参照できなくなります。これらをキャプチャしようとすると、コンパイルエラーが発生します。一方で、staticフィールドや定数は問題なく参照できます。
int outside = 10; const int constValue = 10; Func<int, int> normalLambda = x => x + outside; // OK Func<int, int> staticLambda = static x => x + constValue; // OK Func<int, int> staticLambda2 = static x => x + outside; // コンパイルエラー
キャプチャを禁止することで、そのラムダ式が外部の状態に依存しないことを明示できます。また、後から修正した際に、意図しない変数のキャプチャを防ぐこともできます。
キャプチャを伴うラムダ式では、外部変数を保持するためのオブジェクトが生成される場合があります。staticラムダ式を使えば不要なメモリ割り当てを避けられる可能性があります。
外部状態を参照しないラムダ式では、積極的にstaticを付けていきたいところです。
HM
