JetBrains Rider 2024.1 ヘルプ

コード検査: 破棄されたキャプチャー変数へのアクセス

まず、クロージャ(英語)とは何かを理解していることを確認しましょう。簡単に言うと、C# のクロージャは、ラムダ式または外部スコープからいくつかの変数をキャプチャーする匿名メソッドです。最も簡単な例を次に示します。

// A self-contained lambda. Not a closure. Action printOne = () => { Console.WriteLine("one"); }; // A closure – a lambda that captures a variable from an outer scope. string myStr = "one"; Action print = () => { Console.WriteLine(myStr); };

上記の例では、print は変数 myStr (そのではなく)をキャプチャーし、print() を呼び出したときにのみ myStrを取得します。

より複雑なシナリオでは、クロージャが変化するコンテキストで定義されると、期待通りに動作しないことがあります。

起こりうる状況の 1 つは、using ステートメント内で定義されたクロージャです。

void Foo(string fileName, string text) { using (var writer = new StreamWriter(fileName)) { ExecuteDelayed(() => { writer.Write(text); }); } } private static void ExecuteDelayed(Action action) { // execute action }

上記のコードでは、JetBrains Rider は writer.Write(text); に対して破棄処分へのアクセス警告を発行します。その理由は、writer のスコープが破棄された後に ExecuteDelayed() がラムダを実行でき、実行時例外が発生する可能性があるためです。

ExecuteDelayed() がスタック上のラムダの処理を完了した場合は、action パラメーターに InstantHandle 属性を付けてマークすることができます。

private static void ExecuteDelayed([InstantHandle]Action action) { // execute action }

これは JetBrains Rider のコード解析エンジンに ExecuteDelayed() を使用することが安全であることを伝え、警告は出されません。

関連ページ:

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

設計時コードインスペクションを構成する:デフォルトでは、JetBrains Rider はサポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかにかかわらず、コードインスペクションを特定の範囲でいつでも実行できます。「鉛筆」ウィジェットを使用して、エディターから直接インスペクション設定をすばやく調整するか、設定でより詳細な構成を行うことができます。を押すか、メニューから(W...

コードアノテーション属性

フレームワークは、以下で説明する多くの属性を提供します。これらの属性をコードで使用するには、ソースコードのアノテーションセクションの説明に従ってを参照する必要があります。アノテーション属性:CanBeNullAttribute マークされた要素の値がになることがあることを示します。そのため、使用前にのチェックが必要です。サンプル [CanBeNull] object Test() => null; void UseTest() { var p = Test(); var s = p.ToSt...

コード検査: コレクションの内容が照会されることはありません (private アクセス)

JetBrains Rider はあなたのコードで作成されたコレクションへのアクセスを分析し、たとえこのコレクションへの読み取りアクセスがあってもコレクションがいっぱいになったり変更されたりしない場合は警告します。例:public void Bar() { var col = new List<string>(); Console.WriteLine(col[0]); } すべての標準コレクションタイプは、デフォルトでこの方法で分析されます。必要に応じて、この分析をから派生したカスタム...