ReSharper 2026.3 Help

破棄分析

コード内のリソースリークの数を減らし、パフォーマンスを向上させるには、使い捨てリソースを正しく処理する必要があります。 On the one hand, you want to enforce the using keyword at call sites of the specific APIs, but on the other hand, you do not want to have a lot of noise with false positives around each usage of IDisposable.

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

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

ReSharper: Dispose 分析。 Enforce a 'using' statement

この警告は、使い捨てリソースを 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; } }

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

When you receive an object by using a [MustDisposeResource] API, ReSharper will always consider it disposed and issue no warnings if you wrap the corresponding variable in a using or if you explicitly call Dispose() on that variable.

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

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

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

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

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

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

これらのインスペクションが ReSharper オプション Alt+R、O の コードインスペクション | インスペクション重大度 ページで有効化されていることを確認してください。

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

2026 年 11 月 6 日