2013-02-04 32 views
0
public static bool CheckExpired() 
{ 
    DateTime expiryDate, currentDate = DateTime.Today; 
    DateTime.TryParse(date, out expiryDate); 

    if (expiryDate > currentDate) 
    { 
     return true; 
    } 
    else { return false; } 
} 

這是我現在擁有的。不過,如果日期格式不正確,我希望有第三種選擇。就像現在這樣,它直接跳到else並返回false。帶有非字符串返回類型的日期檢查 - 設計

的問題是,我想三種可能的結果:

真實 - >尚未過期

假 - >已過期

第三 - >無效的日期進入

我只是堅持我如何到達那裏。我知道我可以很容易地使用一個字符串返回類型,但有沒有辦法解決這個問題呢?

+2

你的問題標題不反映你的問題。 – antonijn

+0

@Antonijn - 我的目標是檢查相對於當前日期的日期。我想以非字符串變量類型返回結果。我需要設計幫助。我不知道如何以更好的方式表達它 – user1993843

+1

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 –

回答

5

由於DateTime.TryParse()返回一個布爾如果成功,您可以觸發。

if(DateTime.TryParse(date, out expiryDate)) 
{ 
    if (expiryDate > currentDate) 
    { 
     return true; 
    } 
    else { return false; } 
} 
else 
{ 
    Console.Write("Invalid date."); 
} 

然後使用可空,而不是一個bool的一個返回類型。

+0

然後至少將它寫入錯誤流。 – antonijn

+0

@Antonijn我也可以拋出一個異常,但他的第三個選項只是說'第三個 - >輸入無效日期,所以我會假設他正在使用控制檯應用程序。 –

+0

這並沒有真正回答'我如何返回無效日期輸入值' –

5

你可以使用一個NullableBool

public static bool? CheckExpired(string date) 
    { 
     DateTime expiryDate, currentDate = DateTime.Today; 
     if (DateTime.TryParse(date, out expiryDate)) 
     { 
      return expiryDate > currentDate; 
     } 
     return null; 
    } 

真實 - >尚未過期

假 - >已過期

空 - >無效的日期進入

+0

也想到這個解決方案,但它「可以理解」嗎? –

+0

啊,可爲空的類型會給我第三個選項。我懂了。謝謝! – user1993843

0

你可以使用可爲空的bool(bool?)或int

它會ret甕空,如果它的字符串無法轉換成日期時間

public static bool? CheckExpired() 
    { 
     DateTime expiryDate, currentDate = DateTime.Today; 
     DateTime.TryParse(date, out expiryDate); 
     if (expiryDate == new DateTime()) 
     { 
      return null; 
     } 
     if (expiryDate > currentDate) 
     { 
      return true; 
     } 
     else 
     { return false; } 
    } 
1

我稍微重構的代碼。但是這可能是一個解決方案:

public static bool CheckExpired() 
{ 
    DateTime expiryDate, currentDate = DateTime.Today; 

    if (!DateTime.TryParse(date, out expiryDate)) 
    { 
     throw new Exception("Invalid date"); 
    } 

    return (expiryDate > currentDate); 
} 
6

幾個選項;

  1. 使用bool?類型;那麼你可以返回null。與此相同的是,'null'在您的上下文中並沒有真正意義,因此用法不明確。

  2. 如果格式不正確,則拋出Exception。可能會使用法更清晰(不能通過格式不正確的日期),但意味着您需要在所有呼叫者中嘗試趕上

  3. 使用enum作爲返回值,可以爲您的結果顯式設置名稱。

我覺得一個枚舉可能會做出最合理的位置,併成爲清晰的消費者的方法;

public enum ExpiredResult 
{ 
    Expired, 
    NotExpired, 
    FormatError, 
} 
+0

Enum,我沒有想到這一點。我試圖避免這個任務的異常處理,所以這也很棒。謝謝 – user1993843

0

聽起來像是一個enum工作...

0

我會枚舉去。沿着線的東西:

public static DateValidationResult CheckExpired(string date) 
{ 
    DateTime expiryDate, currentDate = DateTime.Today; 
    if (!DateTime.TryParse(date, out expiryDate)) 
     return DateValidationResult.InvalidDate; 

    return expiryDate > currentDate ? DateValidationResult.Ok : DateValidationResult.Fail; 
} 

public enum DateValidationResult 
{ 
    InvalidDate, 
    Ok, 
    Fail 
} 
0

試試這個:

public static bool? CheckExpired(string date) 
{ 
    DateTime expiryDate; 
    DateTime currentDate = DateTime.Today; 

    if (!DateTime.TryParse(date, out expiryDate)) 
    { 
     return null; 
    } 

    return (expiryDate > currentDate); 
} 

檢查一個null返回值,或有效true/false值,像這樣:

string date = "2/4/2013"; 
bool? isExpired = CheckExpired(date); 

if (!isExpired.HasValue) 
{ 
    Console.Write("Invalid date"); 
} 
else if (isExpired.Value) 
{ 
    Console.Write("Expired"); 
} 
else // if (!isExpired.Value) 
{ 
    Console.Write("Valid"); 
} 
0

我個人」 d只需編寫一個枚舉來封裝返回狀態,如下所示:

public enum ExipiryStatus 
{ 
    Expired, 
    NotExpired, 
    InvalidDate 
} 

public static ExipiryStatus CheckExpired(string date) 
{ 
    DateTime expiryDate, currentDate = DateTime.Today; 

    if (DateTime.TryParse(date, out expiryDate)) 
    { 
     if (expiryDate > currentDate) 
     { 
      return ExipiryStatus.Expired; 
     } 
     else 
     { 
      return ExipiryStatus.NotExpired; 
     } 
    } 
    else 
    { 
     return ExipiryStatus.InvalidDate; 
    } 
} 

我真的不喜歡這種事情的可空布爾值。呼叫地點的回報值應該是什麼,這一點從來都不是很清楚。用枚舉,它是明確的。

[編輯]毆打它。 :)

相關問題