Architect's Log

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

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

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

例えば、IDisposableにNullチェックを入れたDisposeを実装するならこんな感じです。

using System;

namespace SystemExtensions {

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

そうすると、これが、

if (dataAdapter != null) dataAdapter.Dispose();

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

dataAdapter.NullSafeDispose();

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

興味のある人は、IL DASMでIL(中間コード)を見てみてください。System.Runtime.CompilerServices.ExtensionAttributeが付加されているはず。