2012-05-04 50 views
2

我有一个包含事件日期的对象。在数据库中,我有一个名为ObjectEventDateUTC的字段,用于存储发生事件的UTC时间。c#对象定义属性可以为空或不可以

现在,我定义的C#OBJET类是这样的:

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

酒店EventDateUTC获取,对数据库和现场EventDateUserTime被后来设置运行LINQ到SQL查询中设置在一个封装的方法中,接收用户的时区作为参数。

我的问题是这样的:在对象被查询填充的时间与该属性被方法设置的时间之间,字段EventDateUserTime发生了什么变化。我应该保留我的对象定义,还是应该将EventDateUserTime更改为Nullable。

谢谢。

回答

4

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

因此;它们开始为“全零”,即DateTime.MinValue(0001年1月1日)。如果你满足于将它作为一个隐式null(如1.0中所需),那么很好。如果你想更明确一些,那么DateTime?也不错。

+0

好的,谢谢;那么我会离开它。还有一个问题,如果最小值为1900,日期时间可能在公元前5世纪,那些在历史上工作的人会发生什么? – frenchie

+0

@frenchie需要与BC日期一起工作的人不会使用'DateTime' - 而且他们*一般*对时间部分不感兴趣;所以我希望**他们可以使用来自某个任意历元的天数“int”偏移量,可能是BC/CE分割,其中-ve作为BV和+ ve作为CE。 –

+0

好吧,我只是好奇它是如何处理的。另外,我相信这不是那么常见。 – frenchie

2

什么对象由查询和属性由方法

它被初始化为默认值(DateTime.MinValue)设置的时间填充时间之间发生的现场EventDateUserTime。您不需要将其设置为可空类型。

+0

好的,谢谢;那么我会离开它。还有一个问题,如果最小值是1900,日期时间可能在15世纪,那么在历史上工作的人会发生什么? – frenchie

+0

@frenchie - 这是SQL的问题。他们在SQL中找到一些表示方法,并在代码中将其转换为DateTime。 – Oded

+0

好吧,我只是好奇,谢谢你的答案。 – frenchie

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 
     } 
    } 
} 
相关问题