18

文字列引数を検証するためにコードを記述しなければならなかった回数が数えきれないほどあります。

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

とにかくこれを回避する方法はありますか?これを回避するための属性または契約による設計メカニズムはありますか? 言う方法はありません:

public RoomName(NotNullOrEmptyString name)
{

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

4

3 に答える 3

7

これは、属性を使用したコード インジェクションによって行うことができます。

コーディング時間を節約しながら、多くの制御を行う別のオプションは、 CuttingEdge.Conditionsのようなものを使用することです。これにより、引数チェックのための流暢なインターフェースが提供されるため、次のように記述できます。

name.Requires().IsNotNull();
于 2009-07-10T00:56:42.550 に答える
1

質問は少し前に回答されましたが、最近同じ問題について考えています。形式化されたコード コントラクト (自動検証またはチェックを使用) は良い考えのようですが、一般的に、それらの検証機能はかなり制限されており、null または空の文字列のチェックなどの単純なチェックには、同じくらい多くのコード (またはそれ以上) が必要です。 )昔ながらのチェックよりも。

皮肉なことに、文字列の場合の私の意見では、null、空、または空白ではないことがチェックされた文字列をラップし、このインスタンスを渡す 1 つまたは 2 つのクラスが実際に最良の答えです。

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 をスローし、2 番目の場合は ArgumentException をスローする必要があるためです。
  • これは、文字列の値に対する制約を明確に示しています。これは、ラッピング クラスが行うべきことと同じです。実際、何らかの制約があり、頻繁に渡される文字列がある場合は、チェックをカプセル化し、残りのコードが問題にならないようにするクラスでラップすることを常にお勧めします。この良い例は、特定の正規表現を満たす必要がある文字列です。しかし、私はここで質問から逸れています...
于 2011-11-08T08:01:37.187 に答える
0

C#: NotNull 属性と CanBeNull 属性を実装して使用する方法、コード コントラクトの詳細、VS2008 での現在の実装方法、および VS2010 への統合方法も参照してください。

于 2009-07-10T00:54:21.693 に答える