ReSharper 2026.1 Help

コードインスペクション: 'using' 変数にはオブジェクトイニシャライザーを使用しないでください

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

ReSharper はそのようなケースを報告し、初期化を単純な代入に変換し、プロパティの初期化を using ブロック内に移動することを提案します:

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

上記の例では、ReSharper はオブジェクト クラス MyDisposable のソースにアクセスし、そのプロパティのいずれかが実際に例外をスローするかどうかを確認できます。 そうでない場合、問題は報告されません。 ただし、この方法でライブラリ クラスを初期化すると、ReSharper は例外が発生する可能性があるとみなして警告を発行します。

2026 年 6 月 12 日