6

文字列からすべての非数値文字を削除する文字列クラスの単純な拡張メソッドがあります。たとえば、「(555) 215-4444」などの電話番号のような文字列がある場合、「5552154444」に変換されます。次のようになります。

public static string ToDigitsOnly(this string input)
{
    Regex digitsOnly = new Regex(@"[^\d]");
    return digitsOnly.Replace(input, String.Empty);
}

ここでnull値を処理する最もエレガントな方法は何ですか? null が渡された場合に null 値を返すなど、これらの場合に従うべき典型的なパターンはありますか? ここで文字列クラスを拡張しているので、null 値を許可し、引数の例外をスローしたくない場合があります (これを使用するときに引数を実際に渡していないため...) ? しかし、「通常の」メソッドのように例外をスローする必要があると主張する人もいるかもしれません。ここで使用しているベストプラクティスは何ですか?

ありがとう!

4

4 に答える 4

12

最小の驚きの原則に従うことができます: LINQ で実装されたパターンを使用します。

public static string ToDigitsOnly(this string input)
{
    if(input == null)
          throw new ArgumentNullException("input");

    Regex digitsOnly = new Regex(@"[^\d]");
    return digitsOnly.Replace(input, String.Empty);
}

Jon Skeet によって提案されたメソッドを使用できます。それはあなたの小切手を単純に減らします

input.ThrowIfNull("input");

また、ジョンには良いセクションがあります10.2.4 Calling a method on a null reference in C# in Depth、引用:

NULL のチェック 良心的な開発者として、プロダクション メソッドは処理を進める前に常に引数の有効性をチェックしていると確信しています。拡張メソッドのこの風変わりな機能から自然に生じる 1 つの疑問は、最初の引数が null の場合にどの例外をスローするかということです (それが意図されていないと仮定して)。通常の引数であるかのように ArgumentNullException にする必要がありますか、それとも NullReferenceException にする必要がありますか? これは、拡張メソッドが最初からインスタンス メソッドであった場合に起こることです。私は前者をお勧めします: 拡張メソッドの構文がそれを明確にしないとしても、それは依然として引数です。

私はこの推奨事項を次のように考えています (そして私の個人的な経験から): 特に静的メソッドの場合は常に null をチェックし、null 値に依存しないことをお勧めします。拡張メソッドThrowIfNullなど、メソッドの正確な目的である場合にのみ、1 つの例外があります。IsNullOrEmpty

于 2013-05-16T16:09:44.027 に答える
1

単純 ; IsInValid() など、 String の別のメソッドを作成します

public static bool IsInValid(この文字列 s) { return (s == null) || (s.長さ == 0); }

確認したい場所で使用してください...

さらに、この拡張機能はどこでも使用できます

于 2013-07-19T13:21:50.563 に答える
1

動作を適切に伝えている限り (エンドユーザーが何を期待すべきかを理解できるように)、実際には問題ではありません。

組み込みのXML ドキュメント コメントを使用して、予想される動作を伝えることを検討してください。

/// <exception cref="ArgumentNullException">argument is null.</exception>
public string Example( string argument )
{
    if ( argument == null )
        throw new ArgumentNullException();
    return argument.ToString();
}

多くの例については、MSDN のドキュメントを参照してください。

于 2013-05-16T16:30:56.663 に答える