我有一个包含事件日期的对象。在数据库中,我有一个名为ObjectEventDateUTC的字段,用于存储事件发生的UTC时间。
现在,我正在定义c#objet类:
public class MyObject
{
public DateTime EventDateUTC { get; set; }
public DateTime EventDateUserTime { get; set; }
}
属性EventDateUTC
在针对数据库运行的linq-to-sql查询中设置,并且字段EventDateUserTime
稍后设置,在封装方法中接收用户的时区作为参数。
我的问题是:在查询填充对象的时间与方法设置属性的时间之间,字段EventDateUserTime
会发生什么。我应该按原样保留对象定义,还是应该将EventDateUserTime
更改为Nullable。
感谢。
答案 0 :(得分:4)
擦除新对象中的字段,即将内存设置为全零。然后运行字段初始值设定项(如果有的话),然后是构造函数(CLI执行第一步;编译器将最后两个操作组合成.ctor()
)。
因此;它们以“全零”开始,即DateTime.MinValue
(0001年1月1日)。如果您满足于将其视为隐式null(如1.0中所必需的那样),那么很好。如果您想要更明确的内容,那么DateTime?
也可以。
答案 1 :(得分:2)
在查询填充对象的时间与方法设置属性的时间之间,EventDateUserTime字段会发生什么?
它被初始化为其默认值(DateTime.MinValue
)。您无需将其设置为可空类型。
答案 2 :(得分:1)
我应该按原样保留对象定义,还是应该将EventDateUserTime更改为Nullable。
最终,这取决于您的设计:如果未设置EventDateUserTime
的对象的状态是合法的,则使该字段为空;如果总是在从LINQ检索后立即设置它,请保持它不可为空。
或许更好的方法是使EventDateUserTime
成为计算属性,并改为存储用户时区:
public class MyObject {
public TimeZone UserTimeZone { get; set; }
public DateTime EventDateUTC { get; set; }
public DateTime EventDateUserTime {
get {
// Calculate time based on EventDateUTC and UserTimeZone
}
}
}