2013-04-29 85 views
39

如果它有一個值,我需要檢查一個DateTime的值。如何檢查默認的DateTime值?

我有幾種選擇:

if (dateTime == default(DateTime)) 

if (dateTime == DateTime.MinValue) 

,或者使用一個可爲空DateTime?

if (nullableDateTime.HasValue) 

我個人比較喜歡的第三個版本,因爲它的相當不錯的可讀性。 但在我們的數據庫中,我們有一些日期時間列被定義爲非空。 因此,在某些情況下,我必須選擇前兩個選項。

我在某處讀到了在使用泛型時應該使用default關鍵字,但在這種情況下它不是更具可讀性嗎?當使用第二個選項時,我必須知道新的和空的DateTime實例的默認值是DateTime.MinValue,它具有我實現細節的氣味。

那麼我應該使用哪種選項來使用「最佳實踐」?

+0

在代碼塊後的第一句話中,你的意思是「第二版」,還是你的意思是「第三版」? – 2013-04-29 14:49:14

+0

更新了它;)我的意思是第三個版本,因爲該屬性清楚地解釋了我打算檢查的內容:如果該變量的值爲 – dasheddot 2013-04-29 14:50:10

+0

而當它在那個最短日期實際上發生了什麼? – Servy 2013-04-29 14:52:12

回答

42

我很可能會令這確實明確:

// Or private, or maybe even public 
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns 
    = DateTime.MinValue; 

好了,所以我會做的名字略少羅嗦,但你明白我的意思。你如何初始化這個價值並不重要 - 你很清楚你想要做什麼。

(當然,使用可空類型任何你能爲這一點。我假設有人問,因爲你無法在某些情況下這樣做的時間。)

+0

對於MY上下文(無法將數據庫調整爲支持可以爲空的日期時間列),我不幸需要不使用Nullable。所以你的建議是最可以接受的,因爲通過明確地說明檢查背後的業務規則可以更容易實現。我會走這條路。接受它,謝謝! – dasheddot 2013-04-29 15:18:00

+2

@dasheddot:我也會把這個邏輯放在你的數據層,並根據需要轉換爲Nullable ,這樣你的代碼在其他地方都會使用漂亮的代碼,你只需要使用上面的檢查一次。 – Chris 2013-04-29 15:37:09

14

我需要如果它有一個值,則檢查一個DateTime值。

你已經非常詳細地描述了需要Nullable<DateTime>的教科書情況。我會選擇這個選項。如果你需要將值保存到一個非空的數據庫列,但你會明顯需要某種翻譯層,但我會盡量保持任何「魔術」值儘可能接近數據庫,並儘量保持C#代碼的清潔和慣用。)

4

「最佳」做法是使用可空DateTime。由於不信任「魔術」數字的原因,可以創建空值類型,確切地說是

這種方法最重要的是它的意圖 - 它是什麼意味着在您的上下文中有一個「默認」日期/時間?

+0

在我的上下文中,這實際上意味着沒有用戶定義的日期,從業務規則的視線來看是有效的。所以我猜Nullable會是最好的,但不幸的是我無法調整數據庫,這讓我堅持前兩個版本。 – dasheddot 2013-04-29 15:11:54

0

也許你可以使用getdate()在數據庫中設置一個默認值,然後將所有的空值更新爲最小值或任何你喜歡的。至少你會有一個條件