Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

拡張メソッドでNullセーフなメソッドを実装する

オブジェクトのNullチェックって面倒ですよね。.NET3.0以降なら拡張メソッドでNullセーフなメソッドを実装できます。

ここではIDisposableにNullチェックを入れたDisposeを実装してみます。

/// <summary>
/// IDisposableインターフェースの拡張メソッドを実装します。
/// </summary>
public static class IDisposableExtensions {
    /// <summary>
    /// NullセーフなDispose実装です。
    /// </summary>
    /// <param name="self">IDisposableを実装したインスタンス</param>
    public static void NullSafeDispose(this System.IDisposable self) {
        if (self == null) return;
        self.Dispose();
   }
}

そうすると、これが、

if (dataAdapter.SelectCommand != null) {
    dataAdapter.SelectCommand.Dispose();
}

こんな風に少しすっきり書けます。SelectCommandがNullでも例外は発生しません。

11/09 05:25 余計な1行を削除
dataAdapter.SelectCommand.NullSafeDispose();

例外が発生しないのは、拡張メソッドがクラスメソッドだからです。通常のクラスメソッドとの違いは属性の有無だけです。

興味のある人は、IL DASMでILを見てみてください。System.Runtime.CompilerServices.ExtensionAttributeが付加されているはずです。