ReSharper 2025.3 ヘルプ

コード検査: '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 は例外が発生する可能性があるとみなして警告を発行します。

2024 年 4 月 08 日

関連ページ:

コードインスペクション設定を構成する

設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...

コード検査: 'using' 変数にはオブジェクト初期化子を使用しないでください (オブジェクト初期化子式は、'using' 変数の初期化中に例外をスローする可能性があります)

オブジェクト初期化子を使用して変数を初期化すると、初期化中に例外がスローされた場合に問題が発生する可能性があります。これが可能になるのは、実行が句に入る前にコンパイラーがオブジェクトを作成して初期化するためです。初期化中に例外がスローされた場合、プログラムは句に入らず、オブジェクトは破棄されません。オブジェクトプロパティのいずれかがメソッド呼び出しを含む式で初期化されている場合、ReSharper はその呼び出し内で例外が発生する可能性があるという問題を報告し、新しい変数を導入し、呼び出しをその...