我正在编写一个具有Year属性的Movie
类。它应该只是一个int
,还是应该使用DateTime
对象?
只是想知道最好的选择。也许我错过了什么。
答案 0 :(得分:14)
为简单起见,我可能会使用int,并确保在setter中验证年份值是否有意义。
或者,您可以创建一个仅代表年份的类型 - 这样可以确保您不会将年份误用为常规整数值。这变得复杂,特别是如果你想开始重载运算符以支持年加法和减法。除非你真的需要这种类型安全的额外级别,否则我会坚持使用int。
答案 1 :(得分:6)
如果它只是一年的值,那么int会更简单。您还可以考虑将发布日期保存为DateTime,并从中获取年份(而不是具有年份属性)。
答案 2 :(得分:4)
如果它只是一年,那么int
(或自定义类型)就可以。
如果您想存储月份,那么我会使用DateTime
。
敏捷口头禅 - YAGNI(你不会需要它) - 会建议int
,直到你需要更多信息,然后重构为DateTime
。
答案 3 :(得分:1)
使用日期时间对象,你可以从中获得年份。就好了....
答案 4 :(得分:1)
嗯,DateTime具有指定数据和时间的不幸副作用,而不仅仅是一些子集。理想情况下,您可能需要一些具有不同精度级别的“时间”对象。但是为此,我建议使用int
,因为你的模型只有一年,而不是一个完整的日期。
答案 5 :(得分:1)
我会创建一个自定义类型(结构)来保存这个值。
public struct FilmYear
{
private int yr;
private bool isDef;
public bool HasValue { return isDef; }
public bool IsNull { return !HasValue; }
private FilmYear(int year) { yr = year; isDef = true; }
public static FilmYear ThisYear = new FilmYear(DateTime.Today.Year);
public static FilmYear LastYear = new FilmYear(DateTime.Today.Year - 1);
public static FilmYear NextYear = new FilmYear(DateTime.Today.Year + 1);
public static FilmYear Parse(DateTime anyDateInYear)
{ return new FilmYear(anyDateInYear.Year); }
public static FilmYear Parse(int year)
{ return new FilmYear(year); }
public static FilmYear Parse(string year)
{ return new FilmYear(Int32.parse(year)); }
public overide string ToString()
{ return yr.ToString(); }
//etc... you can add:
// - operator overloads to add subtract years to the value,
// - conversion operator overloads to implicitly/(or explicitly)
// convert datetimes to FilmYears, as appropriate
// - overload equality and comparison operators ...
}
用法
FilmYear avatarYear = FilmYear.ThisYear;
FilmYear casablancaYear = FilmYear.Parse(1943);
答案 6 :(得分:1)
如果这适用于临时用户,则int(或基于int的类)是正确的。
如果你正在做一个'真实的'电影摄影,你需要一个int和一个字符串:用于排序和搜索的int,包含数据不完整或暂定的情况的“真相”的字符串(“ 1958?“)。
这也是你不应该使用Date或DateTime的原因:没有办法区分“1/1/1958”和“1958年的某个时间”。
答案 7 :(得分:0)
我认为要正确回答这个问题,你需要提供更多的背景信息。对于什么样的应用?这些信息是否会存储在数据库中?您希望用户对数据执行哪些类型的查询?这样的事情。
答案 8 :(得分:0)
如果您只想跟踪Year
,请将其保留为int
。如果您要跟踪发布日期/生产日期,请使用DateTime
答案 9 :(得分:0)
为简单起见,使用int
是最直接的选择;如果数据有任何特殊方法,那么创建Year
类型并封装所有行为将是一个干净而简单的解决方案 - 如果你走这条路线,你可以将值存储为int
或DateTime
并提供.ToInt(),. ToDateTime(),方法和其他来处理所有用例。