ReSharper 2024.3 ヘルプ

破棄分析

コード内のリソースリークの数を減らし、パフォーマンスを向上させるには、使い捨てリソースを正しく処理する必要があります。一方では、特定の API の呼び出しサイトで using キーワードを強制したいと考えていますが、他方では、IDisposable の使用ごとに誤検知による大量のノイズが発生することは避けたいと考えています。

使い捨てリソースの処理を分析するために、ReSharper は JetBrains.Annotations からの一連のアノテーション属性に依存します。

分析を開始するには、重要な使い捨て API に [MustDisposeResource] 属性のアノテーションを付けます。この属性を使用して、使い捨て型、そのコンストラクター、ファクトリメソッドにアノテーションを付けることができます。これが完了すると、ReSharper はリソースを使い捨てとして扱っていないコールサイトを報告し、対応するクイックフィックスを提案します。

ReSharper: Dispose analysis. Enforce 'using' directive

この警告は、使い捨てリソースを using でラップするか、そのリソースに対して明示的に Dispose() を呼び出すとすぐに消えます。

上のスクリーンショットでわかるように、[MustDisposeResource] の使用箇所も対応するインレイヒントでマークされており、これは ReSharper オプション Alt+R, O環境 | インレイヒント | C# | その他ページで設定できます。

API が Dispose() メソッドを公開していない場合、または破棄を処理するメソッドがいくつかある場合は、実際にリソースを破棄するメソッドに [HandlesResourceDisposal] 属性のアノテーションを付けることができます。

[MustDisposeResource] public class HasNativeResources { // acquire disposable resources [HandlesResourceDisposal] public void Close() {/* process disposal */} } public class Test { public Test() { var resource = new HasNativeResources(); // no warning, because `Close()` handles the disposal resource.Close(); } }

カスタム破棄メソッドが引数として破棄可能なリソースを予期する場合、対応するパラメーターに [HandlesResourceDisposal] のアノテーションを付けることができます。

[MustDisposeResource] public class HasNativeResources : IDisposable { // some work with native resources public void Dispose() {/* process disposal */} } public static class ResourceHelpers { public static void Close([HandlesResourceDisposal] HasNativeResources res) { // handle disposal } } public class Test { public Test() { // no warning, because `Close()` handles the disposal var resource = new HasNativeResources(); ResourceHelpers.Close(resource); } }

最後に、アノテーション付きソースからリソースを取得するメソッドがリソースの破棄を処理せず、それを他の呼び出し元に返す場合、リソースが正しく処理されない可能性があるという問題が呼び出し元に引き継がれます。これが意図的な場合は、メソッドに [MustDisposeResource] アノテーションを付けて、使い捨てリソースを処理する責任を呼び出し元に明示的に委譲することで、アナライザーにそのことを知らせることができます。

[MustDisposeResource] public class HasNativeResources : IDisposable { // some work with native resources public void Dispose() {/* process disposal */} } public class Sample { [MustDisposeResource] public HasNativeResources ProcessWithoutDisposing() { var resource = new HasNativeResources(); Console.WriteLine($"Logging resource: {resource}"); // no warning because the method is marked with [MustDisposeResource] return resource; } }

楽観的分析モードと悲観的分析モード

[MustDisposeResource] API 経由でオブジェクトを受信すると、対応する変数を using でラップした場合、またはその変数に対して明示的に Dispose() を呼び出した場合、ReSharper は常にそのオブジェクトが破棄されたものとみなし、警告を発行しません。

代わりに、使い捨て変数を引数としてメソッドに渡すと、ReSharper は分析モードに応じて警告を発行します。

  • 楽観的 (デフォルト): IDisposable または派生型を受け入れるすべてのメソッドは安全であるとみなされます。つまり、オブジェクトの処理後に Dispose() を呼び出すと想定しています。

  • 悲観的 : メソッドは、IDisposable を受け入れるパラメーターが [HandlesResourceDisposal] 属性でマークされている場合にのみ安全であるとみなされます。それ以外の場合、ReSharper は非処分変数を報告します。

ReSharper オプション Alt+R, Oコードインスペクション | 設定ページで分析モードを変更できます。

破棄分析用のコードインスペクション

破棄分析は次のコードインスペクションに依存します。

これらのインスペクションが ReSharper オプション Alt+R, Oコードインスペクション | インスペクション重大度ページで有効になっていることを確認します。

分析を微調整するには、特定のインスペクションの重大度レベルを変更したり、無視すべき場所の一部のインスペクションを抑制したりできます。

関連ページ:

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

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

インレイヒント

インレイヒントは、コードの読みやすさを向上させる、構成可能なエディターの装飾です。プッシュツーヒントモード:インレイヒントは便利ですが、一方で、エディターのスペースを占有し、場合によっては冗長に見えることがあります。インレイヒントを必要に応じて表示するには、プッシュツーヒントモードを使用します。このモードでは、ヒントを非表示にしておき、必要なときにのみ表示することができます。キーを押すとインレイヒントを表示するアプリケーションのフォーカスがエディターにあることを確認します。Ctrl キーを押し続...

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

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

文字列リテラルのコード分析とヘルパー

プレーン文字列:コードにプレーンな文字列を使って作業しているときに ReSharper がどのように役立つかは次のとおりです。デフォルトでは、ReSharper は、すべての非逐語的な文字列の正しいおよび不正なエスケープシーケンスをハイライトします。キャレットが文字列内にあるときにを押し、対応するコンテキストアクションを選択することで、通常の文字列を逐語的な文字列に変換したり、元に戻したりできます。これは、補間された文字列でも機能します。Enter を押すだけで、文字列リテラルを分割できます。...