2009-12-28 63 views

回答

14

爲了簡單起見,我可能會使用int,並確保在setter中驗證year值是否合理。

另外,您可以創建一個類型來代表年份 - 這將確保您不會誤用年份作爲常規整數值。儘管這會變得複雜,特別是如果你想開始重載運算符來支持年份加法和減法。除非你真的需要這種額外的安全級別,否則我會堅持一個int。

+0

這與'System.DateTime'表示一年的方式一致。如果您要量化時間,那麼最好使用「System.TimeSpan」或「System.Globalization.Calendar」。 – 2009-12-28 18:26:02

1

使用DateTime對象,你可以得到一年就喜歡.year好....

6

如果它一定會成爲一個年份值,則INT會更簡單。您也可以考慮將發佈日期保存爲DateTime,並從中獲取年份(而不是年份屬性)。

+1

這就是我即將發佈的答案。除非您也跟蹤發佈日期,否則請使用Int。 – 2009-12-28 18:16:24

+0

謝謝,好點。 – 2009-12-28 18:24:52

1

那麼,DateTime具有指定數據和時間的不幸副作用,而不僅僅是一些子集。理想情況下,您可能需要一些具有不同準確度級別的「時間」對象。但是對於這個我建議使用int,因爲你只是建模一年,而不是完整的日期。

0

我認爲要正確回答這個問題,您需要提供更多的上下文。什麼樣的應用程序?這些信息是否會存儲在數據庫中?您希望用戶針對數據執行哪種查詢?像這樣的東西。

+0

Thansk,這是一個電影收藏應用程序。所以今年將會有一個xml已經存在,我會閱讀,並提供按年選擇電影的選項,或顯示某一年份的電影等等。 – 2009-12-28 18:26:34

0

如果你只是想跟蹤Year,然後保持int。如果您正在跟蹤發佈日期/生產日期,則使用DateTime

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); 
+0

感謝好奇心,爲什麼你沒有公開構造函數? – 2009-12-28 18:37:40

+0

兩個原因:1)它將訪問語法標準化爲更一致地類似於enum(通過靜態工廠方法)的訪問語法,以及2)強制所有初始化通過該工廠方法......在這個簡化的例子中,影響,但隨着這種結構變得更加複雜,它可以讓一個共同的入口點更容易管理。 – 2009-12-28 20:17:16

4

如果它只是曾經打算在今年再一個int(或自定義類型)會做。

如果您想存儲月份,那麼我會使用DateTime

敏捷咒語 - YAGNI(你不會需要它) - 會建議一個int,直到你想要更多的信息,然後重構爲DateTime

+0

感謝來自int,你真的可以這樣做嗎?我不知道你可以有一個從Int繼承的類型。 – 2009-12-28 18:21:59

+1

@Joan Venge - 你是對的。 'int'是一個「密封」類。答案已更新。 – ChrisF 2009-12-28 18:26:52

+0

呵呵,謝謝.... – 2009-12-28 18:27:40

0

爲了簡單起見,使用int是最直接的選擇;如果有任何特殊的數據處理方法,那麼創建一個Year類型並封裝所有行爲將是一個乾淨而簡單的解決方案 - 如果你走這條路線,你可以將該值存儲爲intDateTime並提供.ToInt(), .ToDateTime(),方法和其他來處理所有的用例。

1

如果這是針對臨時用戶,則int(或基於int的類)是正確的。

如果你正在做一個'真正'的電影,你需要一個int和一個字符串:用於排序和搜索的int,字符串包含數據不完整或暫定的情況的「真值」 「1958年?」)。

這也是爲什麼你不應該使用日期或日期時間:沒有辦法區分「1/1/1958」和「1958年的某個時候」。