获取SQL DateTime Resharper建议在值为new DateTime()
时使用DBNull.Value
。我一直使用DateTime.MinValue
。哪种方法适当?
DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime();
答案 0 :(得分:18)
来自the documentation of DateTime.MinValue:
MinValue定义分配给未初始化的DateTime变量的日期和时间。
因此,结果日期将是相同的。由于DateTime
是值类型,因此两个选项应该是等效的。就个人而言,我更喜欢写DateTime.MinValue
,因为它是自我记录的。
PS:如果您的数据可以包含(有意义的)空值,您可能需要考虑使用nullable types(DateTime?
)。
答案 1 :(得分:2)
通常,我会明确处理NULL
案例。这些方面的东西:
if (!sqlQueryResults.IsNull("Data"))
DoComputationDependantOnDateTime((DateTime) sqlQueryResults["Data"]);
在某些情况下,即使没有数据,执行逻辑也是有意义的。在这种情况下,只有您知道从哪个默认值开始。可能的候选人:
DateTime.MinValue
DateTime.MaxValue
DateTime.Now
我永远不会使用new DateTime()
,因为它的可读性非常差。该声明的回报是什么?您(以及该项目的未来开发人员)可能需要查看文档以确定初始化值的内容。
答案 2 :(得分:1)
我会说总是使用MinValue,因为那时你确切地知道它的价值。当您只使用新的DateTime()时,您正在初始化它以保存一个值,但不指定要放入的值。明确地将值放入其中也更清晰,更清晰。
答案 3 :(得分:1)
DateTime 的默认值是DateTime.MinValue
,所以我猜你使用哪一个并不重要;)
答案 4 :(得分:0)
没有“正确”的方式。人们建立了一个公约,团队也遵循这个惯例。
DateTime.MinValue和new DateTime()是null的有效定义,如果开发人员确定如此。
答案 5 :(得分:0)
表示空值的最可维护方式是使用Nullable<DateTime>
,即DateTime?
。这样,空值清楚地表示为非值而不是需要特殊处理的魔法值。
(当然,空值也需要特殊处理,但更难以忽视。)
如果使用魔术值来表示空值,则没有任何值比其他任何值好得多。您可以使用DateTime.MinValue
或new DateTime()
(提供相同的结果),也可以使用超出应用程序使用范围的任意值。
像DateTime.MinValue这样的值有一个小优势,因为它已经被定义为常量,另一方面你可以定义自己的常量,它的名字稍微好一些,例如:
public const DateTime DateThatMeansNull = new DateTime(1685, 3, 21);