【问题标题】:DateTime/bool and Null values in .Net.Net 中的 DateTime/bool 和 Null 值
【发布时间】:2009-12-10 06:17:29
【问题描述】:

利用 .Net 我从一个旧类继承,该类具有 DateTime 和 bool 参数作为其构造函数的一部分。这些值是从 SQL 数据库中提取的,在 SQL 数据库中,这些值可以为空。当我填充我的类并调用基本构造函数时,这会失败,因为 DateTime 和 bool 在 .Net 中不能有空值。

我知道 Nullable 类型(DateTime?等),我可以定义我的自定义类来利用它们并保存空值,但我无法想出将空值转换为值的方法具有 DateTime 的旧类可以接受。

我讨厌这个想法,但是,我想使用属性将 null 转换为虚拟日期,然后再返回,但是无法确定谁在调用该属性,所以我不知道何时提供 null或从 get 开始的虚拟日期。

任何想法将不胜感激。

【问题讨论】:

  • 我不想回答这个问题,但是...DateTime.MinValue 可能就是您要找的。​​span>
  • 如果不修改旧类,我认为您无法实现这一目标。

标签: .net datetime nullable


【解决方案1】:

如果不能使用 DateTime,我们通常使用 DateTime.MinValue 来处理这类事情?在旧代码中。

【讨论】:

  • 同意;大多数核心框架将DateTime.MinValue 识别为空日期。
  • 如果我的类中有一个可以为空的属性 SomeDate,当我调用此属性来推送使用 DateTime 的旧类中的值时,它需要推送 MinValue 如果我从我的EntityFramework(在幕后自动完成,我需要 Null 值。我将如何确定要发送给每个调用者的值?我将遇到更多 bool 问题,因为你真的不能替换虚拟值并且知道它是假的,除非我使用多个变量(即临时值的值和说明临时值实际上是虚拟值的值。
  • @Jay - 对不起,我不知道处理 bool 的好方法,因为它本质上是一个二进制值。正如您所指出的,如果不引入其他变量,就无法知道该值为 null。如果您确实需要为 bool 处理空值的功能,我最好的建议是修改旧类。
  • 谢谢,我最终将此方法与空合并运算符结合使用。这很乱,但我正在处理其他问题:)
【解决方案2】:

您可以使用null coalescing operator 来使用“当前值或缺少的默认值”。如另一个答案中所述,默认日期将是诸如DateTime.MinValue 之类的句号。

private static readonly DateTime DefaultDate = ...;

...

DateTime? optionalDate = ...;
DateTime date = optionalDate ?? DefaultDate;

【讨论】:

    【解决方案3】:

    具有日期时间的旧类可以接受任何日期时间,因此任何值都可以工作......(但我建议使用 DateTime.MinValue 其他人建议的)。

    您可能更(适当地)关心的是,当一个实例具有这个代表空值的“神奇”值时,使用旧类实例的客户端代码将如何表现。

    旧的类是密封的吗?如果没有,您是否可以创建一个具有附加 bool DateTimeIsDefined 属性的新派生类,以及在未设置标志时以适当方式运行的适当代码(表明 DateTime 未定义?如果较旧的类将其方法声明为virtual,您可以使用考虑 DateTimeIsDefined 属性的较新实现在派生类中覆盖它们......并且传递旧类实例的客户端仍将执行旧实现,而客户端传递较新类的实例将执行较新的。

    【讨论】:

    • 我不认为旧类是密封的,因为 OP 在第一行提到他是从它继承的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2019-02-16
    • 2020-12-20
    • 2019-06-03
    • 2022-11-24
    • 2011-06-12
    相关资源
    最近更新 更多