c#你需要检查某些东西是否有值以及某些东西是否大于0?
在一个项目上工作,编码员在他的支票上做了很多。 首先,他检查可空int是否有值,然后检查它是否大于0.为什么? 为什么要进行两次检查,如果一次检查 – 如果大于0 – 应该足够吗? 因为空值不大于0所以…这是多余的吗?
不确定这是否是我在这里要求的东西,但我不知道如何在谷歌搜索中说出来,所以也许我不知道这个程序员做了什么。
代码可能是多余的。
如果我是int?
然后:
if (i.HasValue && i.Value > 0)
相当于:
if (i > 0)
来自MSDN :
当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不为null,则除了!=(不等于)之外,所有比较都会计算为false。 重要的是不要假设因为特定比较返回false,相反的情况返回true。 在以下示例中,10不大于,小于,也不等于null。 只有num1!= num2的计算结果为true。
可能是变量的值在该上下文中具有不同的含义。
int? someNumber = null; //might mean "there is no value" int? someOtherNumber = 0; //might mean "the user has selected: 0"
下列:
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
没有抛出exception。 因此,在这种情况下,null / HasValue检查是多余的。 有一个小的区别。 下列:
(i.HasValue && (i.Value == 0))
大约快两倍
(i == 0)
当我为空虽然两者都如此之快,但这并不是一个重要的区别。 当我有一个值时,两次比较需要大约相同的时间。
因为默认情况下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
转换为可以为nullable int
,然后检查:
number = ((int?)nullableNum) ?? 0
通常进行空检查以防止exception或设置默认值(在.NET 4之前)。 根据具体情况,检查零将更多地是业务逻辑选择。
在解除引用之前,您可能会发现程序员习惯于对引用类型进行以下类型的检查。 鉴于Nullable HasValue
在概念上与null检查类似,我认为模式“卡住”,即使它与可空类型是多余的。
if ((myObject != null) && (myObject.SomeValue > 0))
…