コードインスペクション: '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 日