c#你需要检查某些东西是否有值以及某些东西是否大于0?

时间:2012-04-18 15:16:26

标签: c# if-statement

在项目上工作,编码员在他的支票中做了很多。首先,他检查可空int是否有值,然后检查它是否大于0.为什么?为什么要进行两次检查,如果一次检查 - 如果大于0 - 应该足够吗?因为空值不大于0所以......这是多余的吗?

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

6 个答案:

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

...