1

I'm playing with Pex and Moles and after running Pex found that nearly all the tests that Pex said failed were because NullReferenceExceptions were "allowed". Reading the Pex documentation, I came across the following:

If a higher-level component passes malformed data to a lower-level component, which the lower-level component rejects, then the higher-level component should be prevented from doing so in the first place.

So what the above is suggesting is that we should test for nulls before other methods/classes are called using something like:

if(foo == null)
   throw new ArgumentNullException("its null and this shouldn't happen")
else
   Bar(foo); //won't get a null reference exception here because we checked first...

IMHO checking for nulls all over doesn't appeal that much for performance and also code bloat reasons but I would like to hear what other people have to say....

4

4 に答える 4

9

はい、IMOを使用する前に、引数を検証する必要があります。

NullReferenceException予期しないnull値が使用された場合に発生するはずです。明示的にスローすることはできません。これは、メソッドのレベルで問題が発生し、最終的にスローされるか、または呼び出されることを示します。

ArgumentNullException呼び出しスタックのメソッドがスローするよりも早い段階でメソッドにバグがあることを示します。(通常、ただし常にではありませんが、直接の発信者です。)

問題を示す例外を早期にスローするほど、null値が最初に侵入した場所を特定しやすくなり「不良データ」が他の場所で厄介な影響を及ぼした可能性が低くなります(たとえば、準備ができているファイルを上書きする実際にデータがnullであることに気付く前に、データを書き込みます)。

内部メソッドまたはプライベートメソッドの呼び出し方法に自信がある場合は、そこでチェックを実行しないことが適切な場合がありますが、パブリックメソッドの場合、引数の検証はほぼ常に適切であると思います。

于 2011-03-17T12:10:56.057 に答える
3

はい、同意します。ANullReferenceExceptionは、null参照である変数のメンバーを呼び出そうとした結果です。これは、メンバーを呼び出すことが合法的な操作であることを確認するための安全策がないことを意味し、これは私の目には悪いことです。入力を使用する前に、常に入力を信用せず、安全に使用できることを確認する必要があります。

于 2011-03-17T12:12:52.140 に答える
1

サービスを公開している関数にパラメーターが渡されるときに、NULLをチェックすることは常に良い習慣です。残りのNULLチェックは常識に基づいていますが、実行すると便利であり、基本的にヘルパーメソッドを使用して実行できます。

最も厄介なNULLチェックは、文字列を使用することです。それらはかなり厄介かもしれませんが、私はそれを克服するために拡張メソッドを使用します:

public static class StringExtensions
{
    public static string NullSafe(this string s)
    {
        return s ?? string.Empty;
    }
}

したがって、次を使用できます。

myString.NullSafe().ToUpper()
于 2011-03-17T12:15:02.767 に答える
1

単純な診断の観点からでも、NullReferenceExceptionまたはArguementNullExceptionについて、より多くの情報を得ることができますか?

さらに一歩進んで、スタック トレースを写真から取り除きます。あなたの2つのメッセージはおそらく次のとおりです。

NullReferenceException: "オブジェクト参照がオブジェクトのインスタンスに設定されていません。"

  • どこかで何かがヌルで、おそらくそうなるとは思っていませんでした。
  • エラーを見つけるためにおそらくデバッグする必要があります。

ArguementNullException: "System.ArgumentNullException: MyVariable を null にすることはできません。"

  • null がメソッドに渡されたことを知っています。
  • おそらく、変数名によって、可能なメソッドのより小さなセットに絞り込むことができます
  • おそらくまだデバッグする必要がありますが、ブレークポイントを配置する一般的な場所をいくつか知ることができるはずです。

また、構文を確認し、ArgumentNullException コンストラクターに渡す必要があるものに関する情報を読んでください。

throw new ArgumentNullException("its null and this shouldn't happen");

それは違うの。

throw new ArgumentNullException("VariableName");

そうです。

于 2011-05-19T18:15:16.663 に答える