23

プロジェクトに取り組んでいると、コーダーはチェックでこれを頻繁に行います。まず、nullable int に値があるかどうかを確認し、次に 0 より大きいかどうかを確認します。なぜでしょうか。1 つのチェック (0 より大きい場合) で十分なはずなのに、なぜ 2 つのチェックを行うのでしょうか? null は 0 より大きくないので ...それは冗長ですか?

これが私がここで尋ねるものであるかどうかはわかりませんでしたが、Google検索でそれをどのように表現すればよいかわからなかったので、このプログラマーが何をしているのかわからないかもしれません.

4

6 に答える 6

34

コードはおそらく冗長です。

私がそうならint?

if (i.HasValue && i.Value > 0)

次と同等です。

if (i > 0)

MSDNから:

null 許容型との比較を実行するときに、null 許容型のいずれかの値が null で、もう一方の値が null でない場合、!= (等しくない) を除くすべての比較は false と評価されます。特定の比較が false を返すため、反対のケースが true を返すと想定しないことが重要です。次の例では、10 は null よりも大きくも小さくも等しくもありません。num1 != num2 のみが true と評価されます。

于 2012-04-18T15:20:16.397 に答える
4

そのコンテキストでは、変数の値が異なる意味を持っている可能性があります。

int? someNumber = null; //might mean "there is no value"
int? someOtherNumber = 0; //might mean "the user has selected: 0"
于 2012-04-18T15:20:00.927 に答える
4

以下:

class Program {
    static void Main(string[] args) {
        int? i = null;
        if (i > 0) { Console.WriteLine(">0");
        } else {     Console.WriteLine("not >0");
        }
        if (i < 0) { Console.WriteLine("<0");
        } else {     Console.WriteLine("not <0");
        }
        if (i == 0) {Console.WriteLine("==0");
        } else {     Console.WriteLine("not ==0");
        }
        Console.ReadKey();
    }
}

出力します

not >0
not <0
not ==0

例外をスローせずに。したがって、この場合の null/HasValue チェックは冗長です。1 つの小さな違いがあります。以下:

(i.HasValue && (i.Value == 0))

の約 2 倍の速さです。

(i == 0)

どちらも非常に高速ですが、重要な違いではありません。i に値がある場合、2 つの比較にかかる時間はほぼ同じです。

于 2012-04-18T15:28:26.750 に答える
2

プログラマーは、参照型を逆参照する前に、次のような参照型のチェックに慣れていることがあります。Nullable のHasValue概念が null チェックと似ていることを考えると、nullable 型では冗長ですが、パターンが「スタック」していると思います。

if ((myObject != null)  && (myObject.SomeValue > 0))

...

于 2012-04-18T15:27:14.230 に答える
1

Null チェックは通常、例外を防ぐため、またはデフォルト値を設定するために行われます (.NET 4 より前)。状況によっては、ゼロをチェックする方がビジネス ロジックの選択肢になります。

于 2012-04-18T15:20:20.880 に答える