コードインスペクション: 'using' 変数にはオブジェクトイニシャライザーを使用しないでください(イニシャライザー式は 'using' 変数の初期化中に例外をスローする可能性があります)
オブジェクト初期化子を使用して using 変数を初期化すると、初期化中に例外がスローされた場合に問題が発生する可能性があります。 これが可能になるのは、実行が using 句に入る前にコンパイラーがオブジェクトを作成して初期化するためです。 初期化中に例外がスローされた場合、プログラムは using 句に入らず、オブジェクトは破棄されません。
オブジェクトプロパティのいずれかがメソッド呼び出しを含む式で初期化されている場合、JetBrains Rider はその呼び出し内で例外が発生する可能性があるという問題を報告し、新しい変数を導入してその呼び出しをその変数に置き換えることを提案します。 これにより、新しい変数の初期化中に潜在的な例外が発生し、 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();
}
上記の例では、JetBrains Rider は初期化メソッド CalculateValue() のソースにアクセスし、実際に例外をスローするかどうかを確認できます。 そうでない場合、問題は報告されません。 ただし、この方法でライブラリメソッドを使用すると、JetBrains Rider は例外が発生する可能性があるとみなし、警告を発行します。
2026 年 6 月 12 日