8

私は次のものを持っており、最初のテストがやり過ぎかどうか疑問に思っていました:

static void Main(string[] args) {
    if (args.Length == 0 || args == null) {           
        //do X
    }
    else { 
        //do Y 
    }
}

言い換えれば、私が求めているのは、args.Length がゼロである、または args が null である可能性があるということです....または、これらの条件の 1 つだけで十分でしょうか?

4

5 に答える 5

15

は、パラメーターを指定Mainして呼び出されることは決してないように定義されていnullます。なんらかの方法で null パラメータを受け取った場合、環境非常に壊れているため、何をしてもすべての賭けが無効になるため、 をチェックしても何も得られませんnull

一方、null をチェックする場合コードの読者と管理者はその理由を理解する必要があります。元のプログラマーは、なぜこのような無駄なチェックを入れたのでしょうか? 彼は私たちが知らないことを知っていましたか?彼がいくつかの奇妙なコーナーケースのバグを発見した可能性があるため、単純に削除することはできません!

言い換えれば、プログラムが複雑になり、コードの将来の読者をつまずかせることになります。そうしないでください。その将来のユーザーはあなたかもしれませ。未来の自分を幸せにして、意味のあるコードを書きましょう。

ただし、そのような null チェック意味を持つ状況では、それは一番左の条件でなければなりません。

このようなテストargs.Length == 0 || args == nullでは: が最初args.Lengthに評価され、それが失敗した場合は と比較されます。つまり、が null の場合、コードは例外をスローします。そのはずargsnullargsargs == null || args.Length == 0

于 2012-03-19T08:30:51.473 に答える
10

thisによると、確認する必要があるのは次のとおりです。

if (args.Length == 0)
{
    // Do X
}

をチェックしnullても害はありませんが、実際には必要ありません。

于 2012-03-19T08:25:46.453 に答える
3

高性能で頻繁に使用される機能に興味がない場合は、追加の制御を作成することは決して悪い考えではありません。ですから、やり過ぎではありません。

そしてもう1つ:最初に をチェックしnull、次に をチェックしますLength

于 2012-03-19T08:23:46.493 に答える
3

入力データがない場合、args.Length は 0 ですが、null ではありません。入力データがある場合、agrs.Length は入力引数の数に等しくなります。結論として、args を null にすることはできませんが、length をゼロにすることはできます。

常に最初に null をチェックする PS

于 2012-03-19T08:31:08.227 に答える
0
if (args == null)
{
    Console.WriteLine("args is null"); // Check for null array
}
else
{
    if (args.Length == 0)
    {
        //do X
    }
    else 
    { 
        //do Y 
    }
}
于 2012-03-19T08:25:26.953 に答える