コード検査: 破棄されたキャプチャー変数へのアクセス
まず、クロージャ(英語)とは何かを理解していることを確認しましょう。簡単に言うと、C# のクロージャは、ラムダ式または外部スコープからいくつかの変数をキャプチャーする匿名メソッドです。最も簡単な例を次に示します。
上記の例では、print は変数 myStr (その値ではなく)をキャプチャーし、print() を呼び出したときにのみ myStr の値を取得します。
より複雑なシナリオでは、クロージャが変化するコンテキストで定義されると、期待通りに動作しないことがあります。
起こりうる状況の 1 つは、using ステートメント内で定義されたクロージャです。
上記のコードでは、ReSharper は writer.Write(text); に対して破棄処分へのアクセス警告を発行します。その理由は、writer のスコープが破棄された後に ExecuteDelayed() がラムダを実行でき、実行時例外が発生する可能性があるためです。
ExecuteDelayed() がスタック上のラムダの処理を完了した場合は、action パラメーターに InstantHandle 属性を付けてマークすることができます。
これは ReSharper のコード解析エンジンに ExecuteDelayed() を使用することが安全であることを伝え、警告は出されません。
関連ページ:
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...
コードアノテーション属性
フレームワークは、以下で説明する多くの属性を提供します。これらの属性をコードで使用するには、ソースコードのアノテーションセクションの説明に従ってを参照する必要があります。アノテーション属性:CanBeNullAttribute マークされた要素の値がになることがあることを示します。そのため、使用前にのチェックが必要です。サンプル [CanBeNull] object Test() => null; void UseTest() { var p = Test(); var s = p.ToSt...
コード検査: コレクションの内容が照会されることはありません (private アクセス)
ReSharper はあなたのコードで作成されたコレクションへのアクセスを分析し、たとえこのコレクションへの読み取りアクセスがあってもコレクションがいっぱいになったり変更されたりしない場合は警告します。例:public void Bar() { var col = new List<string>(); Console.WriteLine(col[0]); } すべての標準コレクションタイプは、デフォルトでこの方法で分析されます。必要に応じて、この分析をから派生したカスタムコレクション...