【问题标题】:Conditional Statement Checking Null条件语句检查 Null
【发布时间】:2012-04-05 16:31:57
【问题描述】:

我正在尝试弄清楚如何编写一个简短的单行条件语句。

如果此日期不为空,则将过滤器添加到当前过滤器列表中:

fromDt ?? filters.Add(FilterType.DateFrom, fromDt);

有没有办法做到这一点?我知道我能做到..

(fromDt != null) ? "something" : "something_else",但我不需要“else”,我真的很想使用?? 运算符进行空值检查。

【问题讨论】:

  • 我建议你不要这样做——你是在用清晰度来换取原始字符数
  • 你的代码很糟糕。对您的同事来说幸运的是,如果不使用 if 语句,就没有单行的方法。
  • 这只是我的一个副项目,它只是我想弄清楚使用的东西。我不会在大多数 [或任何] 商业案例中使用它。

标签: c# c#-4.0 if-statement unary-operator


【解决方案1】:

这是怎么回事?

if (fromDt != null) filters.Add(FilterType.DateFrom, fromDt);

首先,您的代码应该是可读的。即使您的 ?? 代码有效,我也不知道它在第一眼看到它的作用。

【讨论】:

  • 实际上,首先你的代码应该可以工作。但只有在这种情况下最微小的一点是它应该可读且易于其他人维护。
【解决方案2】:

您正在尝试的代码使您的代码非常难以阅读。就像BrokenGlass 所说的那样,您正在用清晰度来换取原始字符数。

这是 C# 支持的唯一“单行”解决方案。

if (fromDt != null) filters.Add(FilterType.DateFrom, fromDt);

但我鼓励每个人将其扩展为至少两行(我的偏好是带大括号的四行)。

【讨论】:

    【解决方案3】:

    撇开解决方案的目的不谈,在使用?? 时,遵循单行可能会给您end您想要的结果。不过不要在家里尝试这个。

    filters.Add(FilterType.DateFrom, fromDt ?? DateTime.MinValue)

    这个想法是将 DateFrom 设置为最小可能值,本质上是添加一个开放过滤器。

    【讨论】:

    • 投反对票的人想详细说明一下吗?这解决方案,这有什么问题吗?
    • 可能是因为它暗示了一个需要检查的哨兵值。如果调用filters.Add 的东西是一个包含 1000000 个项目序列的循环,其中只有一个非空的日期。您最终会得到一个包含 999999 个过滤器的列表,其中包含需要忽略的哨兵和一个真实的过滤器。最好以一个真正的过滤器结束。
    • @Shibumi,引用 Oreo 博士的话“这只是我的一个副项目,只是我想弄清楚要使用的东西。我不会在大多数 [或任何] 商业案例中使用它。”软件开发中的每个解决方案都可以用“如果事情......”来无效。要求是使用某些句法结构,而不考虑性能、占用空间、可读性和常识。另外,引用我自己“不要在家里尝试这个”暗示了这个答案不适用于具有 1000000 次迭代的循环。
    • 无论如何,这都是对我问题的有效答案。这绝对是一个有趣的解决方案,并且给了我一些可以使用的东西。
    • @THX 我认为 ...不考虑性能、占用空间、可读性和常识。 是您添加的内容,而不是您添加的内容原始规范。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2021-08-12
    • 2017-03-26
    相关资源
    最近更新 更多