2009-07-10 10 views
17

は、私は文字列引数を検証するためのコードを記述しなければならなかったどのように多くの数え切れないほど知らない:C#:引数の検証:ヌル/空の文字列

public RoomName(string name) 
{ 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentException("Cannot be empty", "name"); 
    } 
} 

これを避けるために、とにかくありますか?これを避けるための属性や設計ごとの仕組みがありますか?言うことはありません:

public RoomName(NotNullOrEmptyString name) 
{ 

実際にそのタイプを作成する必要はありませんか?

+0

このリンクは、[属性とメソッドの代行受信を使用した引数の検証](http://www.codinginstinct.com/2008/05/argument- validation-using-attributes.html) – Joe

答えて

7

あなたは属性を持つコードインジェクション経由でそれを行うことができます。

いくつかの符号化時間を節約するために別のオプションが、それでもあなたのコントロールの多くを与える、CuttingEdge.Conditionsのようなものを使用することです。これは、引数チェックのための流れるようなインターフェイスを提供しますので、あなたが書くことができます。

name.Requires().IsNotNull(); 
1

質問はしばらく前に回答されているが、私は最近、同じ問題について考えてきました。 (以上(自動検証や小切手での)正式なコードの契約は良いアイデアのように見えるが、一般的に、彼らの検証機能は非常に限られており、nullでまたは空の文字列のチェックのような単純なチェックのために、彼らは同じくらいのコードが必要です)を使用しています。

を:

皮肉なことに、文字列の場合のための私の意見では最良の答えは確かに、ヌル空または空白ではないことが確認された文字列をラップし、周りのこのインスタンスを渡し一つまたは二つのクラスであります

public class NonEmptyString : IComparable<NonEmptyString>, ... 
{ 
    private readonly string _value; 

    public NonEmptyString(string value) 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException("value"); 
     } 
     if (value.Length == 0) 
     {     
      throw NewStringIsEmptyException("value"); 
     } 
     _value = value; 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 

    ... 
} 

public class NonWhiteSpaceString : NonEmptyString 
{ 
    .... 
} 

確かに、これらのインスタンスの周りに渡すと、彼らは自分自身nullであるかどうかを確認することからあなたを防ぐことはできませんが、それはいくつかの大きな利点が持っている:

  • をあなたが空または白 - に確認する必要はありません。スペース文字列を何度も何度も繰り返します。これは、文字列たくさん回る。私は私の実装で行われてきたよう
  • は、nullをチェックすると、前者の場合には、特定の例外ArgumentNullExceptionをスローするようにしたいので、空の値(または空白値)をチェックするよりも別の何かであり、第二にあるいくつかのArgumentExceptionが。
  • それは明らかに任意のラップクラスが行うことになっているだけのよう、文字列の値に制約を知らせます。実際には、制約がある文字列があり、それがたくさん渡されている場合は、チェックをカプセル化し、残りのコードをトラブルから守るクラスにまとめておくことを常にお勧めします。これの良い例は、ある正規表現を満たさなければならない文字列です。しかし、私はここの質問から転用しています...
+1

私はあなたの解決策にパラメータ名のいくつかの追跡を追加する必要があると思う。あなたが '' FROB(NULL、「値」) 'と' FROB(文字列fooという、文字列バー)と呼ばれ、エラーメッセージ 'System.ArgumentNullExceptionを得た場合、ほとんどはそれが混乱見つけるだろうからです。値はnullにすることはできません。パラメータ名:System.ArgumentNullExceptionの代わりにvalue':値はnullにはできません。パラメータ名:foo' –

関連する問題