C#如何处理可空类型

时间:2014-08-02 15:20:58

标签: c# comparison

处理可空类型的正确方法是什么,例如' DateTime?&#39 ;?当你需要选择可以为空的2个日期中较小的一个并且其中一个为空时,<或者>不能将null与实际日期结果比较为false,例如:

DateTime? function( DateTime? a, DateTime? b ){
    return a < b ? a : b;
}
如果a或b为空,

将返回b。

我是否必须使用if语句或是否有解决方法?

编辑:如果其中一个值为null,我希望不返回

编辑:我很抱歉,如果我使用某个功能作为示例令人困惑。这不是我想避免使用if语句。但是,在可以为空的DateTimes之间进行了大量的比较,我希望避免创建需要进行explicti调用等的自定义比较器。

是否可以覆盖默认的DateTime?比较

4 个答案:

答案 0 :(得分:3)

DateTime? function( DateTime? a, DateTime? b ){
    if(!a.HasValue && !b.HasValue)
        throw new ArgumentNullException();
    else if(!a.HasValue)
        return b;
    else if(!b.HasValue)
        return a;

    return a.Value < b.Value ? a : b;
}

逻辑:

  1. 如果两个值均为null,则抛出异常。
  2. 如果A或B为null,则返回另一个。
  3. 如果A或B都不是null,则返回小于另一个。

答案 1 :(得分:3)

您可以使用Nullable.Compare

static DateTime? GetLowerDateTime(DateTime? a, DateTime? b)
{
    int val = Nullable.Compare(a, b);
    if (val < 0) return a ?? b;
    if (val > 0) return b ?? a;
    return a; //whichever you want to return if they're equal
}

答案 2 :(得分:2)

您需要弄清楚在调用函数的每种情况下您想要发生什么,然后编写代码来执行该操作。我有点担心你正在寻找&#34;变通办法&#34; to&#34;写if语句&#34;,好像某种if陈述是邪恶的,你不应该使用它们?不要试图聪明或偷偷摸摸 - 你可能正在编写一个需要工作可维护的应用程序,而不是进入代码高尔夫比赛。

相反,您应该遵循this answer中的优秀建议:指明您的函数需要如何工作,然后完全实现规范。要清晰准确。

您的函数有四种可能的输入组合,您需要确定每个输入的返回值。从您的编辑中,您似乎希望函数尽可能频繁地返回非null值,这样可以简化:

  1. function(a, b):返回a中的任何一个,b更小。
  2. function(a, null):必须返回a
  3. function(null, b):必须返回b
  4. function(null, null):必须返回null
  5. 所以,我们写下:

    DateTime? function( DateTime? a, DateTime? b )
    {
        // Case 1.
        if (a.HasValue && b.HasValue)
        {
            return a < b ? a : b;
        }
    
        // Case 2
        if (a.HasValue)
        {
          return a;
        }
    
        // Case 3 & 4
        return b;
    }    
    

答案 3 :(得分:1)

这应该适合你:

DateTime? function( DateTime? a, DateTime? b ){
    return a < b ? a : (b ?? a);
}

??是空合并运算符。结帐msdn:null-coalescing operator

编辑:删除冗余代码