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))