破棄分析
コード内のリソースリークの数を減らし、パフォーマンスを向上させるには、使い捨てリソースを正しく処理する必要があります。 一方では、特定の API の呼び出しサイトで using キーワードを強制したいと考えていますが、他方では、 IDisposable の使用ごとに誤検知による大量のノイズが発生することは避けたいと考えています。
そのため、使い捨てリソースの処理を分析する際、ReSharper は JetBrains.Annotations の一連のアノテーション属性に依存します。
分析を開始するには、重要な使い捨て API に [MustDisposeResource] 属性のアノテーションを付けます。 この属性を使用して、使い捨て型、そのコンストラクター、ファクトリメソッドにアノテーションを付けることができます。 これが完了すると、ReSharper はリソースを使い捨てとして扱っていない呼び出しサイトを報告し、対応するクイックフィックスを提案します:

この警告は、使い捨てリソースを using でラップするか、そのリソースに対して明示的に Dispose() を呼び出すとすぐに消えます。
上記のスクリーンショットのように、 [MustDisposeResource] の使用箇所も対応する インレイヒントでマークされており、これは ReSharper オプション
Alt+R、O
の ページで設定できます。
API が Dispose() メソッドを公開していない場合、または破棄を処理するメソッドがいくつかある場合は、実際にリソースを破棄するメソッドに [HandlesResourceDisposal] 属性のアノテーションを付けることができます。
カスタム破棄メソッドが引数として破棄可能なリソースを予期する場合、対応するパラメーターに [HandlesResourceDisposal] のアノテーションを付けることができます。
最後に、アノテーション付きソースからリソースを取得するメソッドがリソースの破棄を処理せず、それを他の呼び出し元に返す場合、リソースが正しく処理されない可能性があるという問題が呼び出し元に引き継がれます。 これが意図的な場合は、メソッドに [MustDisposeResource] アノテーションを付けて、使い捨てリソースを処理する責任を呼び出し元に明示的に委譲することで、アナライザーにそのことを知らせることができます。
楽観的分析モードと悲観的分析モード
[MustDisposeResource] API からオブジェクトを受け取った場合、対応する変数を using でラップするか、その変数に対して明示的に Dispose() を呼び出した場合、ReSharper はそのオブジェクトが破棄されたものとみなし、警告を出しません。
代わりに使い捨て変数を引数としてメソッドに渡すと、ReSharper は分析モードに応じて警告を発行します:
楽観的 (デフォルト):
IDisposableまたはその派生型を受け取るすべてのメソッドは安全とみなされます。つまり、オブジェクトの処理後にDispose()が呼び出されると仮定します。悲観的: メソッドは、
IDisposableを受け入れるパラメーターが [HandlesResourceDisposal] 属性でマークされている場合にのみ安全であるとみなされます。 それ以外の場合、ReSharper は非破棄変数を報告します。
ReSharper オプション Alt+R、O の ページで分析モードを変更できます。
破棄分析用のコードインスペクション
破棄分析は次の コードインスペクションに依存します:
コードインスペクション:[MustDisposeResource] アノテーションが付与されたメソッドの戻り値は破棄されていません
コードインスペクション: 戻り値は破棄する必要がありますが、メソッドまたは関数に [MustDisposeResource] アノテーションが付けられていません
これらのインスペクションが ReSharper オプション Alt+R、O の ページで有効化されていることを確認してください。
分析を微調整するには、特定のインスペクションの 重大度レベルを変更したり 、無視すべき場所の一部のインスペクションを 抑制したりできます。