2009-01-22 85 views
91

解析()和TryParse()有什麼區別?解析訴TryParse

int number = int.Parse(textBoxNumber.Text); 

// The Try-Parse Method 
int.TryParse(textBoxNumber.Text, out number); 

是否存在某種形式的錯誤檢查,如Try-Catch Block?

回答

129

Parse如果無法解析該值則會拋出異常,而TryParse會返回bool,表示它是否成功。

TryParse不僅僅是try/catch內部 - 它的整點在於它沒有例外地實現,因此速度很快。事實上,最有可能實施的方式是,內部Parse方法將調用TryParse,然後在返回false時拋出異常。

簡而言之,如果您確定該值是有效的,則使用Parse;否則使用TryParse

+1

「內部解析方法將調用TryParse」 除了Parse pre-date TryParse幾個版本。當然,他們可能已經將核心實現移到了TryParse ... – 2009-01-22 01:10:18

+4

@Joel - 我認爲他們已經移動了實現,但我只是看了一下反射器,它們是* *完全相同的代碼一個人「扔......」,一個人「返回虛假」。我想知道他們爲什麼不鞏固?! – 2009-01-22 08:39:33

+5

雖然考慮到它,但Parse會拋出一些不同的異常,所以如果它只有一個TryParse的bool,那麼它不會知道拋出哪個異常。 – 2009-01-22 08:42:10

20

如果不能將字符串轉換爲整數,然後

  • int.Parse()將拋出一個異常
  • int.TryParse()將返回false(而不是拋出一個異常)
3

TryParse方法允許您測試某些東西是否可解析。如果您嘗試使用無效int的第一個實例中的Parse,則您將在TryParse中得到一個異常,它會返回一個布爾值,讓您知道解析是否成功。

作爲腳註,傳遞給大多數TryParse方法的null將引發異常。

0

TryParse不返回值,它返回一個狀態碼來表明解析是否成功(並且不會引發異常)。

+4

TryParse確實通過out關鍵字指定的參數2返回值。 – 2010-02-14 16:00:40

+0

@Christian Madsen - 謝謝。 – 2010-02-15 00:13:20

2

TryParse and the Exception Tax

解析,如果從一個字符串到指定的數據類型轉換失敗,而明確的TryParse避免拋出異常拋出異常。

-2

double.Parse(「 - 」);引發異常,而 double.TryParse(「 - 」,出解析);解析爲0 ,所以我想TryParse會做更復雜的轉換。

0

爲了記錄,我正在測試兩個代碼:它只是試圖將字符串轉換爲數字,如果失敗,則將數字指定爲零。

 if (!Int32.TryParse(txt,out tmpint)) { 
      tmpint = 0; 
     } 

和:

 try { 
      tmpint = Convert.ToInt32(txt); 
     } catch (Exception) { 
      tmpint = 0; 
     } 

對於C#,最好的選擇是的TryParse使用,因爲嘗試&捕捉替代拋出的異常

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 

這是痛苦的緩慢和不希望的,但是,代碼不會停止,除非調試的異常通過它停止。

0

我知道它的一個很老的帖子,但是想到在Parse vs TryParse上分享一些更多的細節。

我有一個場景,其中DateTime需要轉換爲字符串,如果datevalue null或string.empty我們正面臨異常。爲了克服這個問題,我們已經用TryParse替換了Parse並且會得到默認日期。

舊代碼:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy"); 
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy"); 

新代碼:

DateTime startDate = default(DateTime); 
DateTime endDate=default(DateTime); 
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate); 
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate); 

必須聲明另一個變量並用作出於對的TryParse。