コード検査: 複数列挙の可能性
次のコードスニペットを考えてみましょう。
GetNames()
が IEnumerable<string>
を返すと仮定すると、2 つの foreach
ステートメントでこのコレクションを 2 回列挙することで、実際に余分な作業をしています。
GetNames()
がデータベースクエリを生成すると、さらに悪化する可能性があります。その場合、2 つの呼び出し間でデータベースを変更するプロセスがあれば、両方の foreach
ループで異なる値が得られる可能性があります。
この種の問題は簡単に修正できます。たとえば、シーケンスを配列またはリストに変換することにより、変数の初期化の時点で列挙を強制します。
残りのコードは、配列型とリスト型の両方が IEnumerable
インターフェースを実装しているため、同じままにすることができます。
偽陽性
場合によっては、このインスペクションは、IEnumerable オブジェクトが列挙される前にいくつかのメソッドに渡された場合に誤検出を引き起こすことがあります。例:
この場合、ReSharper は、メソッドが追加の列挙を行うことを前提としています。これはほとんどの場合に当てはまります。メソッドが実際に IEnumerable オブジェクトを列挙しない場合は、偽陽性を防ぐために、対応するパラメーターに [NoEnumerationAttribute] をマークすることができます。
関連ページ:
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...
コードアノテーション属性
フレームワークは、以下で説明する多くの属性を提供します。これらの属性をコードで使用するには、ソースコードのアノテーションセクションの説明に従ってを参照する必要があります。アノテーション属性:CanBeNullAttribute マークされた要素の値がになることがあることを示します。そのため、使用前にのチェックが必要です。サンプル [CanBeNull] object Test() => null; void UseTest() { var p = Test(); var s = p.ToSt...