ReSharper 2025.3 ヘルプ

コード検査: ラムダ式 / 匿名メソッドには、含まれているコンテキストのキャプチャーが含まれていてはなりません

C# のラムダ式は、通常、パフォーマンスとメモリへの影響に関連しています。ラムダ式が提供する抽象化は、ほとんどのシナリオで追加コストの価値がありますが、これらのコストは一部のホットパスコードでは受け入れられない場合があります。

このようなコードを区別するために、[RequireStaticDelegate] 属性を JetBrains.Annotations から使用できます。この属性は、この属性でアノテーションが付けられたパラメーターに渡されるラムダ式に含まれるコンテキストのキャプチャーをレポートすることにより、割り当てのないコーディング手法を適用します。含まれているコンテキストをキャプチャーしないラムダ式は、デリゲートインスタンスを一度だけ割り当て、残りのプログラム実行のためにキャッシュするため、このようなラムダ式は割り当てがなくなります。

これは、ユーザーが Func デリゲート型入力パラメーターを使用してキャッシュされた値を計算することを期待する API の例です。

class Cache { private Dictionary<string, int> _cache = new(); public int GetData(string key, [RequireStaticDelegate] Func<string, int> calculator) { if (!_cache.TryGetValue(key, out var value)) { value = _cache[key] = calculator(key); } return value; } }

... しかし、間違いを犯して、x パラメーターの代わりに変数 key をキャプチャーするのは簡単すぎます。

class CacheTest { public CacheTest() { var cache = new Cache(); var key = "abc"; // Warning: anonymous function // should not have captures of the containing context var a = cache.GetData(key, calculator: x => key.Length); } }

ReSharper はそのようなキャプチャーを報告しますが、クイックフィックスを提案することはありません。呼び出しコンテキストから何もキャプチャーせずにコードが正しく機能することを確認する必要があります。

デリゲートパラメーターとしてメソッドを渡す場合、ReSharper は、コンパイラーレベルでのキャプチャーを防ぐために、可能な場合はラムダ式に static 修飾子を追加することを提案します。

// Allocates on each call var a = cache.GetData(key, calculator: Compute); // Doesn't allocate var b = cache.GetData(key, calculator: static x => Compute(x));
2024 年 2 月 11 日

関連ページ:

コードインスペクション設定を構成する

設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...

アノテーションを使用してコードインスペクションを改善する

コード検査や他の多くの ReSharper の機能は、問題を検出し、改善を提案し、他の方法であなたを手助けするために、言語構成の動作を知ることに主に依存しています。ただし、この種の分析ではすべてを検出できるわけではありません。例: メソッドがフォーマットメソッドとして設計されている場合、メソッドの呼び出しに必要な引数が含まれていない場合、構造解析では潜在的な問題は見つかりません。この場合や他の多くの場合、ReSharper のは非常に役立ちます。このフレームワークで宣言された属性を使用することに...