23

在一个项目上工作,编码员在他的检查中做了很多。首先,他检查可空 int 是否有值,然后检查它是否大于 0。为什么?如果一次检查(如果大于 0)就足够了,为什么还要进行两次检查?因为空值不大于 0 所以……那是多余的吗?

不确定这是否是我在这里问的问题,但我不知道如何在谷歌搜索中说出它,所以也许我不知道这个程序员做了什么。

4

6 回答 6

34

代码可能是多余的。

如果我是int?那么:

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

相当于:

if (i > 0)

来自MSDN

当您对可空类型执行比较时,如果其中一个可空类型的值为 null 而另一个不是,则所有比较的结果都为 false,但 !=(不等于)除外。重要的是不要假设因为特定的比较返回 false,相反的情况返回 true。在以下示例中,10 不大于、小于或等于 null。只有 num1 != num2 的计算结果为真。

于 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 检查是多余的。有一个小区别。以下:

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

大约是两倍的速度

(i == 0)

当 i 为空时,尽管两者都非常快,但这并不是重要的区别。当 i 有一个值时,这两个比较需要大约相同的时间。

于 2012-04-18T15:28:26.750 回答
2

您可能会发现程序员习惯于在取消引用之前对引用类型进行以下类型的检查。鉴于 NullableHasValue在概念上与 null 检查相似,我猜该模式“卡住”了,即使它与可空类型是多余的。

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

...

于 2012-04-18T15:27:14.230 回答
2

由于默认情况下 anint不能是null并且它的值将被设置为, and0的运算符希望与而不是与 一起工作,所以这就是为什么你必须首先检查它是否是,因为如果它为空会导致错误。><valuesnullsnull

您可以使用始终返回 的逻辑int,即使它null“不”返回null,但它会返回0默认值,通过使用它,您可以立即检查null+ >

以下是一些方法:

int? nullableNum = null;
int number;
number = nullableNum.GetValueOrDefault(); // will return 0 if null
number = nullableNum ?? 0;                // will return 0, or whatever you insert

If you don't know if the nullableNum will be a nullable type or not (usually not relevant in C#), then in case it turns out not to be nullable, the null operator won't work and nor the GetValueOrDefault() method, so in that case you can cast its type to a nullable int and then check:

number = ((int?)nullableNum) ?? 0
于 2018-07-24T21:12:51.373 回答
1

空值检查通常用于防止异常或设置默认值(在 .NET 4 之前)。根据具体情况,检查零将更像是一种业务逻辑选择。

于 2012-04-18T15:20:20.880 回答