2008-09-14 70 views
15

這對某些人來說可能看起來很簡陋,但是這個問題一直在嘮叨我,當我編寫一些代碼時,我想我會問。C#Casting vs. Parse

以下哪個是c#中更好的代碼,爲什麼?

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString() 

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString() 

歸根結底,是能夠更好地鑄造或解析?謝謝大家!

回答

12

如果g [0] [「MyUntypedDateField」]實際上是一個DateTime對象,那麼投射是更好的選擇。如果它不是一個真正的DateTime,那麼你別無選擇,只能使用Parse(如果你試圖使用演員,你會得到一個InvalidCastException)

+2

當對象不是DateTime時,請不要使用Parse,而要使用ParseExact並指定預期的日期和時間格式,以避免依賴於當前的用戶區域設置。看到我對這個問題的回答。 – qbeuek 2008-09-15 06:22:19

0

As @Brian R. Bondy指出它取決於執行g [ 0] [「MyUntypedDateField」]。安全的做法是使用DateTime.TryParse作爲運算符。

+0

讓我們避免編寫防禦性代碼。當提供的值是不同的格式或類型時,開發人員應該知道期望的類型/格式和**失敗**(例如拋出異常)。 TryParse應僅在用戶提供的輸入上使用**。 – qbeuek 2008-09-15 06:26:04

0

解析需要一個輸入字符串,需要一個對象,因此在上面提供的第二個示例中,您需要執行兩個強制轉換:一個從對象轉換爲字符串,然後從字符串轉換爲DateTime。第一個沒有。

但是,如果在執行演員時有發生異常的風險,那麼您可能需要轉到第二條路線,以便您可以TryParse並避免引發昂貴的異常。否則,轉到最有效的路線,只投一次(從對象到DateTime)而不是兩次(從對象到字符串到DateTime)。

3

鑄造是只有很好的答案。

您必須記住,ToString和Parse結果並不總是準確的 - 有些情況下,您無法安全地在這兩個函數之間往返。

ToString的文檔說,它使用當前的線程文化設置。解析的文件說,它也使用當前線程的文化設置(到目前爲止好 - 他們使用的是同一種文化),但有一個明確的一句話,說:

格式是由當前的性能影響DateTimeFormatInfo對象,默認情況下它是從「控制面板」中的「區域和語言選項」項派生的。 如果當前的DateTimeFormatInfo.DateSeparator和DateTimeFormatInfo.TimeSeparator屬性設置爲相同的值,則Parse方法可能會意外拋出FormatException的一個原因是。

所以根據用戶設置的情況下,toString /解析代碼,並會出現意外故障時...

1

你的代碼表明,該變量可以是日期或看起來像一個日期的字符串。日期你可以簡單地返回一個強制轉換,但字符串必須解析。解析帶來兩個警告;

  1. ,如果你不能確定這個字符串可以解析,然後使用DateTime.TryParse()

  2. 始終包含對您要解析的文化的引用。 ToShortDateString()在不同的地方返回不同的輸出。你幾乎肯定會用同樣的文化來解析。我建議這個功能處理這兩種情況;

    private DateTime ParseDateTime(object data) 
    { 
        if (data is DateTime) 
        { 
         // already a date-time. 
         return (DateTime)data; 
        } 
        else if (data is string) 
        { 
         // it's a local-format string. 
         string dateString = (string)data; 
         DateTime parseResult; 
         if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture, 
               DateTimeStyles.AssumeLocal, out parseResult)) 
         { 
          return parseResult; 
         } 
         else 
         { 
          throw new ArgumentOutOfRangeException("data", 
               "could not parse this datetime:" + data); 
         } 
        } 
        else 
        { 
         // it's neither a DateTime or a string; that's a problem. 
         throw new ArgumentOutOfRangeException("data", 
               "could not understand data of this type"); 
        } 
    } 
    

然後調用這樣;

ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString(); 

請注意,壞的數據會引發異常,所以您需要捕獲該異常。

另外; 'as'操作符不適用於DateTime數據類型,因爲它僅適用於引用類型,而DateTime是值類型。