IDisposable を継承しているクラスは使い終わったら Dispose メソッドを呼び出して破棄を明示しますが using 構文の外で開放したい場合も using 構文を使って簡単に開放できます。
// こんなクラスがあったときに public class Sample : IDisposable { //... public static Close(Sample s1, Sample s2) { // ★Disposeは以下のように書けば簡単に呼び出せる using(s1) { } using(s2) { } // ↓↓↓↓↓↓ // ★内部的に以下のように安全に開放されるように展開されている try { } finally { if (s1 != null) { ((IDisposable)s1).Dispose(); } } try { } finally { if (s2 != null) { ((IDisposable)s2).Dispose(); } } }
自分で何か書くより圧倒的に簡潔かつ安全な(=コンパイル時にが勝手に生成してくれる)ので、可能な限りこの記述をした方がいいと思います。
ちなみに中括弧のありなしで展開のされ方が微妙に変わります。
public static Close(Sample s1, Sample s2) { using(s1) using(s2) { } // ★★s1 に中括弧を付けない // ↓↓↓↓↓↓ // ★★中括弧が無いとネストされた開放になる try { try { } finally { if (s2 != null) { ((IDisposable)s2).Dispose(); // ★★s2はネストされて展開される } } } finally { if (s1 != null) { ((IDisposable)s1).Dispose(); } } }
C# 8.0から追加された「Using Declaration」を使用しても同じ結果になります。
Disposeで開放目的だけの場合こっちの構文は通常使用しないと思います。
public void Close(Sample s1, Sample s2) { using var _1 = s1; using var _2 = s2; // ★★Using Declaration 構文を使う // ↓↓↓↓↓↓ // ★★ネストされた開放になる try { try { } finally { if (s2 != null) { ((IDisposable)s2).Dispose(); // ★★s2はネストされて展開される } } } finally { if (s1 != null) { ((IDisposable)s1).Dispose(); } } }