2

我有一个包含事件日期的对象。在数据库中,我有一个名为 ObjectEventDateUTC 的字段,它存储事件发生的 UTC 时间。

现在,我正在像这样定义 c# 对象类:

public class MyObject
{
   public DateTime EventDateUTC { get; set; }
   public DateTime EventDateUserTime { get; set; }
}

该属性EventDateUTC在针对数据库运行的 linq-to-sql 查询中EventDateUserTime设置,该字段稍后在接收用户时区作为参数的封装方法中设置。

EventDateUserTime我的问题是:在查询填充对象的时间和方法设置属性的时间之间,字段会发生什么情况。我应该保持我的对象定义不变还是应该更改EventDateUserTime为 Nullable。

谢谢。

4

3 回答 3

4

新对象中的字段被擦除,即内存设置为全零。然后字段初始化程序(如果有)运行,然后是构造函数(CLI 执行第一步;编译器将最后两个操作组合为 make .ctor())。

因此; 它们以“全零”开始,即DateTime.MinValue(0001 年 1 月 1 日)。如果您满足于将其视为隐式 null(在 1.0 中是必需的),那么很好。如果您想要更明确的内容,那DateTime?也可以。

于 2012-05-04T13:26:09.400 回答
2

在查询填充对象的时间和方法设置属性的时间之间,字段 EventDateUserTime 会发生什么情况

它被初始化为其默认值 ( DateTime.MinValue)。您不需要将其设置为可为空的类型。

于 2012-05-04T13:26:01.023 回答
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
        }
    }
}
于 2012-05-04T13:29:28.507 回答