.NET Framework 4.0 で追加予定の Code Contract が待ちきれず、メソッドのパラメータチェックでこんなクラスを使うようになった。
public static class Requires { public static void NotNull<T>(T value, string paramName) { if (value == null) { throw new ArgumentNullException(paramName); } } public static void NotNullOrEmpty(string value, string paramName) { NotNull(value, paramName); if (string.IsNullOrEmpty(value)) { throw new ArgumentException( string.Format("{0} に空の文字列を指定できません。", paramName), paramName); } } // 他にもいろいろ定義する }
こんな感じで使っている。
public string Greet(string name) { Requires.NotNull(name, "name"); // なにかやる }
if 文で直に書くよりも短いし、「null でないパラメータを渡せ!」っていうメッセージが強く伝わる、と思う。「Requires」っていう名前がポイント。
Code Contract みたいに、ビルド時にエラーを出してくれるわけじゃない。当たり前。単なるメソッドだもの。
こういった方法は、Enterprise Library や Managed Extensibility Framework のソースコードで見かけた。一般的な方法なんだろう。
追記
Code Contract 試してみたけど、デバッグ実行時にダイアログがばんばん出て、非常にウザかった。使い方が間違っているのか、それとも、そういうものなのか……。
public string Greet(string name) { Contract.Requires<ArgumentNullException>(name != null, "name"); // なにかやる }
name が null のとき ArgumentNullException が発生すると思ったんだけどなぁ。