用C#尽量简洁

本文关键字:简洁 | 更新日期: 2023-09-27 18:20:07

我正在寻找一种更简洁的方式来表达C#中的以下测试,其中x是可为null的int

英语:如果x有一个值并且y>x,那么做一些

C#使其更加简洁:

if(x.HasValue && y > x)

类似地,如果我想将可为null的布尔值(x)默认为false,我可能会写:

if(x ?? false)
{
    //x is true
}
else
{
    //x is either null or false
}

而不是:

if(x.HasValue() && x == true)

非常感谢

用C#尽量简洁

y > x应该足够。

0 >= (int?)null // false
0 <= (int?)null // false

(OTOH,我被这种行为所困扰,我认为有些东西会"大于"null。在这种情况下,y > (x ?? 0)或类似的东西可能会有用。)

来自Ben Voigt关于使用可空类型的评论:

当您与可为null的类型执行比较时,如果其中一个可为null类型的值为null,而另一个不为null,则除!=(不平等)重要的是不要假设因为特定的比较返回false,相反的情况返回true。

快乐的编码。

if(x.HasValue && y > x)非常简洁,更不用说清晰了。变通办法多少有些做作。考虑:

if ((x ?? (y + 1)) < y)

正如pst所指出的,您实际上并不需要HasValue调用。但为了清楚起见,将其包括在内可能是个好主意。

虽然可能有一种方法可以使语句更简洁,但我会避开它。您展示的用法非常地道,并且使您的意图清晰明了。依赖可为null的不等式运算符的行为(如@pst的回答)可能会导致对代码的误解,并淡化变量可为null这一事实。我会坚持你所拥有的。

您可以使用扩展方法。

public static class IntegerExtensions
{
    public static bool IsLargerThan(this int? number, int numberToCompare)
    {
        return number.HasValue && number > numberToCompare;
    }
}
...
// Usage:
int? val1 = 15;
int val2 = 10;
if (val1.IsLargerThan(val2))
{
    // Do Something
}

您尝试过GetValueOrDefault()方法吗?

如果x是int?,那么您的第一个If语句可以重写为if (x.GetValueOrDefault() > y)。如果x是bool?,那么它可以简单地重写为if(x.GetValueOrDefault())