Dispose呼び出しを簡潔に書く

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();
        }
    }
}