在项目上工作,编码员在他的支票中做了很多。首先,他检查可空int是否有值,然后检查它是否大于0.为什么?为什么要进行两次检查,如果一次检查 - 如果大于0 - 应该足够吗?因为空值不大于0所以......这是多余的吗?
不确定这是否是我在这里要求的,但我不知道如何在谷歌搜索中说出来,所以也许我不知道这个程序员做了什么。
答案 0 :(得分:22)
代码可能是多余的。
如果我是int?
那么:
if (i.HasValue && i.Value > 0)
相当于:
if (i > 0)
来自MSDN:
当您对可空类型进行比较时,如果其中一个可空类型的值为null而另一个不可为,则除了!=(不等于)之外,所有比较都会计算为false。重要的是不要假设因为特定比较返回false,相反的情况返回true。在以下示例中,10不大于,小于或等于null。只有num1!= num2的计算结果为真。
答案 1 :(得分:4)
可能是变量的值在该上下文中具有不同的含义。
int? someNumber = null; //might mean "there is no value"
int? someOtherNumber = 0; //might mean "the user has selected: 0"
答案 2 :(得分: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)
当我为空虽然两者都如此之快,但这并不是一个重要的区别。当我有一个值时,两次比较需要大约相同的时间。
答案 3 :(得分:2)
由于默认情况下int
不能为null
,并且其值将设置为0
,因此>
和<
的运算符可以与values
而不是nulls
,所以这就是为什么您必须首先检查它是否为null
的原因,因为如果它为null,它将导致错误。
您可以使用始终返回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
如果您不知道nullableNum
是否为nullable type
(通常在C#中不相关),那么如果事实证明不是nullable
,则null
操作符将无效,并且GetValueOrDefault()
方法也不起作用,因此在这种情况下,您可以将其type
的{{3}}转换为nullable int
,然后检查:>
number = ((int?)nullableNum) ?? 0
答案 4 :(得分:1)
通常进行空检查以防止异常或设置默认值(在.NET 4之前)。检查零将更多地是业务逻辑选择,具体取决于具体情况。
答案 5 :(得分:1)
在解除引用之前,您可能会发现程序员习惯于对引用类型进行以下类型的检查。鉴于Nullable HasValue
在概念上与null检查类似,我认为模式“卡住”,即使它是可空类型的多余。
if ((myObject != null) && (myObject.SomeValue > 0))
...