11

数か月前、私はC と C++ について同様の質問をしましたが、最近は "Windows Phone" のことで C# にもっと注意を払っています。

では、C# では、わざわざメソッド境界で NULL をチェックする必要があるでしょうか? これは C や C++ とは異なると思います。なぜなら、C# では通常、特定の参照が有効かどうかを判断できるためです。コンパイラは、初期化されていない参照がどこにも渡されないようにするため、残っている唯一の間違いは、それが null になることです。 . さらに、これらのことに対して .NET Framework 内で定義された特定の例外ArgumentNullExceptionがあり、無効な null が渡されたときにプログラマーが受け取るべきだと考えるものを成文化しているようです。

私の個人的な意見は、これを行う呼び出し元は壊れているということです。その呼び出し元は、日の終わりまで NRE をスローする必要があります。ただし、これについては、ネイティブ コードの世界にいるときよりも確信が持てません。この点で、C# は、C や C++ と比較して、場所によってかなり異なるプログラミング スタイルを持っています。

では... C# メソッドの null パラメーターを確認する必要がありますか?

4

4 に答える 4

8

はい、チェックしてください。コード コントラクトを使用して、null 以外のパラメーターが必要であることを呼び出し元に伝えることをお勧めします。

void Foo(Bar bar) {
    Contract.Requires(bar != null);
}

これは、クライアントがパラメーターに必要なものを正確に確認できるため、特に有利です。

Code Contracts を使用できない場合は、guard 句を使用します

void Foo(Bar bar) {
    Guard.Against<ArgumentNullException>(bar == null);
}

早く失敗しましょう。

于 2011-05-07T04:12:31.173 に答える
5

メソッドで特定のパラメーターをnullにしたくない場合は、スローする(またはジェイソンが提案ArgumentNullExceptionするようにコントラクトを使用する)方が良いと思います。メソッドを呼び出すときに最初に null を渡さないことは、クライアントへのコントラクトによるはるかに優れた指標です。

ヌルチェックは、クライアントの責任であり、両側でより保守しやすいコードを作成します(多くの場合、双方にとって有利な状況です) ... 少なくともそれは私が感じていることです。

于 2011-05-07T04:13:04.803 に答える
3

少なくともパブリック メソッドでは、すべてのパラメーターを検証することをお勧めします。これは、メソッドのコントラクトを説明するため、バグをより迅速に見つけるのに役立ち、コードを読むときにも役立ちます。

AssertUtilitiesパラメータと状態の検証のための一連のメソッドを持つ静的クラスを実装しました。そのようなクラスを呼び出す人もいると思いますGuard

例えば:

    public static void ArgumentNotNull(object argument, string argumentName)
    {
        if (argument == null)
            throw new ArgumentNullException(argumentName);
    }

    public static void ArgumentInRange(decimal argument, decimal minValue, decimal maxValue, string argumentName)
    {
        if (argument < minValue || argument > maxValue)
        {
            throw new ArgumentOutOfRangeException(
                argumentName,
                FormatUtilities.Format("Argument out of range: {0}. Must be between {1} and {2}.", argument, minValue, maxValue));
        }
    }

    public static void ArgumentState(bool expression, string argumentName, string formatText, params object[] args)
    {
        if (!expression)
            throw new ArgumentException(FormatUtilities.Format(formatText, args), argumentName);
    }

    public static void ArgumentHasText(string argument, string argumentName)
    {
        ArgumentNotNull(argument, argumentName);
        ArgumentState(argument.Length > 0, argumentName, "Argument cannot be an empty string.");
    }
于 2011-05-07T04:47:51.640 に答える
2

では... C# メソッドの null パラメーターを確認する必要がありますか?

はい、もちろんnull許可されている場合を除きます。

より良い視点:有効なパラメータ値を常に確認する必要があります。参照が null であってもよい場合もあれば、そうであるint必要がある>= 0場合や、文字列が NullOrWhiteSpace でない場合もあります。

そのため、すべてのメソッドをパラメーター検証ブロックで開始することをお勧めします。

そこから、いくつかの選択肢があります。通常、内部/プライベート メソッドの検証はそれほど重要ではないと考えられており、パフォーマンス上の理由から、条件付きにすることができます (または除外することもできます)。

境界での検証は通常、リリース ビルドで残されます。オフにする理由はほとんどありません。

ほとんどのプロジェクトでは、メソッド内での繰り返しのコーディングを最小限に抑えるために、いくつかのヘルパー クラスを検証に使用します。組み込みの System.Diagnostics.Contracts クラスは、非常に優れたツールキットですが、まだあまり普及していません。Code-Contracts ツールには、パラメーターの検証に関する多くの設定があります。

于 2011-05-07T08:05:23.307 に答える