在获取SQL DateTime时,Resharper建议当值为DBNull.Value
时使用new DateTime()
。我一直使用DateTime.MinValue
。哪种方式是正确的?
DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime();
在获取SQL DateTime时,Resharper建议当值为DBNull.Value
时使用new DateTime()
。我一直使用DateTime.MinValue
。哪种方式是正确的?
DateTime varData = sqlQueryResult["Data"] is DateTime ? (DateTime) sqlQueryResult["Data"] : new DateTime();
MinValue定义了未初始化的DateTime变量的日期和时间。
因此,结果的日期将是相同的。由于DateTime
是值类型,两种选项应该是等价的。个人倾向于编写DateTime.MinValue
,因为它具有自我说明性。
注:如果您的数据可能包含(有意义的)null值,则考虑使用可空类型(DateTime?
)。
NULL
情况。大概是这样处理的:if (!sqlQueryResults.IsNull("Data"))
DoComputationDependantOnDateTime((DateTime) sqlQueryResults["Data"]);
DateTime.MinValue
DateTime.MaxValue
DateTime.Now
new DateTime()
,因为它的可读性非常差。这条语句返回什么?您(以及将来参与此项目的开发人员)可能需要查阅文档才能确定其初始化值。DateTime的默认值是DateTime.MinValue
,所以我猜你使用哪个都无所谓 ;)
表示空值的最可维护方式是使用Nullable<DateTime>
,即DateTime?
。这样,空值就清晰地表示为非值,而不是需要特殊处理的魔法值。
(当然,空值也需要特殊处理,但很难忽略。)
如果使用魔法值来表示空值,则没有任何值比其他值更好。您可以使用DateTime.MinValue
或new DateTime()
(它们给出相同的结果),或者您可以使用任何超出应用程序使用范围的任意值。
像DateTime.MinValue这样的值具有轻微优势,因为它已经定义为常量,另一方面,您可以定义自己的常量,其名称稍微更好,例如:
public const DateTime DateThatMeansNull = new DateTime(1685, 3, 21);
没有所谓的“正确”方式。有一种人们设定的约定,团队遵循这个约定。
如果负责开发的人决定如此,DateTime.MinValue和new DateTime()是有效的对null的定义。