7

オブジェクトのインスタンスを返すまたは操作するメソッドを実装/使用する場合、関数パラメーターをチェックするための最も洗練されたアプローチは何ですか?

呼び出すメソッド:

someType GetSomething(object x)
{
    if (x == null) {
        return;
    }

    //
    // Code...
    //
}

以上:

someType GetSomething(object x)
{
    if (x == null) {
        throw new ArgumentNullException("x");
    }

    //
    // Code...
    //
}

呼び出し方法:

void SomeOtherMethod()
{
    someType myType = GetSomething(someObject);

    if (someType == null) {
        return;
    }

}

以上:

void SomeOtherMethod()
{
    try {
        someType myType = GetSomething(someObject);
    } catch (ArgumentNullException) {
    }
}

同様の質問を閲覧する場合、try/catchを使用しない理由はパフォーマンスです。しかし、私見では、try-catchの方が見栄えがします:)。

では、どちらがより「エレガント」なのでしょうか。

4

4 に答える 4

9

の受け渡しがnull有効でない場合は、例外をスローします(つまり、これは決して起こらない例外的な状況です)。

nullパラメータ有効な場合は、対応するオブジェクトを返します。

null一般に、パラメーターを受け入れることは悪い習慣です-驚き最小の原則に反し、呼び出し元がそれが有効であることを知る必要があります。

于 2010-10-21T14:43:08.133 に答える
4

エレガンスに関する限り、コード契約を上回ることは困難です。

Contract.Requires(x != null);
于 2010-10-21T15:21:44.310 に答える
2

例外は例外的な場合にのみ使用してください。引数が(正当に)nullである可能性があると予想される場合は、それを確認する必要があります。例外を使用しないでください。IMOメソッドにnullを渡すことが意味をなさない場合は、呼び出し元のサイトで(呼び出しの前に)nullをチェックする必要があります。

于 2010-10-21T14:44:17.613 に答える
0

あなたの例では、GetSomthingはプライベートです。これは、すべての発信者を追跡し、Null値が渡されないようにすることができることを意味します。

 if (x != null)
   someType myType = GetSomthing(x)
 else
   // Initialize  x or throw an InvalidOperation or return whatever is correct

ただし、それが本当にプライベートでない場合は、Odedや他の人が言ったように行う必要があります。nullかどうかを確認し、ほとんどの場合ArguementExecptionをスローします。

于 2010-10-21T15:13:06.280 に答える