C# using文でオブジェクト初期化子を使用すると警告される

C#でusing文やusing変数宣言(C#8.0~)のオブジェクトに対して、
オブジェクト初期化子を使用すると警告がでます。
以下の画像で、zipFile2の方はnewの部分が波線で警告されているのが分かります。

これはオブジェクト初期化子の処理中で例外が発生した場合に、
オブジェクトが正しく Dispose されないことが原因です。
Low-level なコードで表すと、オブジェクト初期化処理はtry文の外にあり、
この場合はコンストラクタで例外が発生した場合と同様に、
Dispose が呼ばれないことが確認できます。

オブジェクトの初期化に関しては、
一般的にオブジェクト初期化子を利用するのが良いと言われています。
ただし、using文ではその限りではないことが分かりました。

また IDisposable を継承するクラスに関しても、
プロパティ設定で例外が発生するような設計は避けるべきです。
ただ設計によっては record型の値オブジェクト等のコンストラクタでは、
例外を出すことも珍しくない為、usingのオブジェクト初期化子には注意が必要です。

コメントを残す