2011-02-09 69 views

回答

82

更好這最後一部分複製粘貼是非常主觀的。比如我個人比較喜歡int.TryParse,因爲我最經常不在乎爲什麼解析失敗,如果失敗的話。然而,int.Parse可以(根據documentation)拋出三種情況例外:

  • 輸入是空
  • 輸入不是一個有效的格式
  • 輸入中包含了許多procudes溢出

如果你在乎它爲什麼失敗,那麼int.Parse顯然是更好的選擇。

一如既往,上下文是王道。

+1

雖然我同意背景爲王的一般推力,但我會說TryParse *幾乎總是*更好,這比主觀的個人偏好略高一點。你的反例(區分不同的異常,可以拋出)是相當不尋常的,並有可能與每種類型的異常,而不是捕獲所有的catch塊可以更好地編碼。 – Joe 2011-02-09 17:51:04

+1

@Joe:是的,如果你想在不同的異常類型來區分,什麼不是具體的catch塊,否則會顯得很奇怪。我的答案旨在討論`Parse` vs`TryParse`,而不是問題中的特定代碼示例。正如我在其他地方提到的,我同意`TryParse`幾乎總是最好的方式,但關鍵字是「幾乎」,而不是「永遠」。 – 2011-02-09 18:57:39

+0

@Joe:我已經提出了這個觀點。請參閱評論交換原始問題。弗雷德裏克關於絕對言論的權利永遠不會是真的。 (OMG一個悖論!) – 2011-02-10 04:17:18

10

第一。第二個被認爲是,例外編碼

8

就個人而言,我寧願:

if (int.TryParse(string, out num)) 
{ 
    ... 
} 
4

第一!你不應該例外編碼。

你可以縮短到

if (int.TryParse(string, out num))

3

首先,到目前爲止。正如George所說的,其次是編碼例外,並且對性能有重大影響。總是應該關注性能。

2

捕捉異常有更多的開銷,所以我會去TryParse。

另外,如果轉換失敗,TryParse方法不會引發異常。它消除了在s無效並且無法成功解析的情況下使用異常處理來測試FormatException的需求。

here

37

是否例外轉換有時會失敗,或者是預計和正常轉換有時會失敗嗎?如果前者,使用例外。如果後者,避免例外。出於某種原因,例外被稱爲「例外」;你應該只使用它們來處理異常的情況。

1

還有一點需要注意的是,在Visual Studio調試/輸出窗口中記錄(可選)異常。即使異常的性能開銷可能微不足道,但在調試時爲每個異常寫入一行文本都會使事情減慢。在失敗的整數解析操作的噪音中,更多值得注意的例外也可能被淹沒。

15

如果這的確是預期的轉換有時會失敗,我喜歡整齊地放在一個線路上使用int.TryParse和這種與conditional (Ternary) operator,就像這樣:

int myInt = int.TryParse(myString, out myInt) ? myInt : 0; 

在這種情況下,零將被用作如果TryParse方法失敗,則爲默認值。

也爲可空類型,如果轉換失敗,這將覆蓋任何默認值與null真的很有用。