ReSharper 2026.1 Help

コードインスペクション: 'using' 変数にオブジェクトイニシャライザーを使用しないでください(オブジェクトイニシャライザー式は 'using' 変数の初期化中に例外をスローする可能性があります)

オブジェクト初期化子を使用して using 変数を初期化すると、初期化中に例外がスローされた場合に問題が発生する可能性があります。 これが可能になるのは、実行が using 句に入る前にコンパイラーがオブジェクトを作成して初期化するためです。 初期化中に例外がスローされた場合、プログラムは using 句に入らず、オブジェクトは破棄されません。

オブジェクトプロパティのいずれかがメソッド呼び出しを含む式で初期化されている場合、ReSharper はその呼び出し内で例外が発生する可能性がある問題を報告し、新しい変数を導入し、その変数で呼び出しを置き換えることを提案します。 これにより、新しい変数の初期化中に潜在的な例外が発生し、 using 変数が任意の cas で破棄されることが保証されます。

class MyDisposable : IDisposable { public int Prop { get; init; } public void Dispose() { // TODO release managed resources here } } class Test { public Test() { using (var x = new MyDisposable { Prop = CalculateValue() }) { Console.WriteLine(x); } } int CalculateValue() => throw new(); }
class MyDisposable : IDisposable { public int Prop { get; init; } public void Dispose() { // TODO release managed resources here } } class Test { public Test() { var calculateValue = CalculateValue(); using (var x = new MyDisposable { Prop = calculateValue }) { Console.WriteLine(x); } } int CalculateValue() => throw new(); }

上記の例では、ReSharper は初期化メソッド CalculateValue() のソースにアクセスし、それが実際に例外をスローするかどうかを確認できます。 そうでない場合、問題は報告されません。 ただし、この方法でライブラリメソッドを使用すると、ReSharper は例外が発生する可能性があるとみなし、警告を発行します。

2026 年 6 月 12 日