我知道..我知道...性能不是這裏主要關心的,但只是爲了好奇,有什麼更好?什麼是更好的:int.TryParse或嘗試{int.Parse()} catch
bool parsed = int.TryParse(string, out num);
if (parsed)
...
OR
try {
int.Parse(string);
}
catch() {
do something...
}
我知道..我知道...性能不是這裏主要關心的,但只是爲了好奇,有什麼更好?什麼是更好的:int.TryParse或嘗試{int.Parse()} catch
bool parsed = int.TryParse(string, out num);
if (parsed)
...
OR
try {
int.Parse(string);
}
catch() {
do something...
}
更好這最後一部分複製粘貼是非常主觀的。比如我個人比較喜歡int.TryParse
,因爲我最經常不在乎爲什麼解析失敗,如果失敗的話。然而,int.Parse
可以(根據documentation)拋出三種情況例外:
如果你在乎它爲什麼失敗,那麼int.Parse
顯然是更好的選擇。
一如既往,上下文是王道。
第一。第二個被認爲是,例外編碼。
就個人而言,我寧願:
if (int.TryParse(string, out num))
{
...
}
第一!你不應該例外編碼。
你可以縮短到
if (int.TryParse(string, out num))
首先,到目前爲止。正如George所說的,其次是編碼例外,並且對性能有重大影響。總是應該關注性能。
捕捉異常有更多的開銷,所以我會去TryParse。
另外,如果轉換失敗,TryParse方法不會引發異常。它消除了在s無效並且無法成功解析的情況下使用異常處理來測試FormatException的需求。
從here
是否例外轉換有時會失敗,或者是預計和正常轉換有時會失敗嗎?如果前者,使用例外。如果後者,避免例外。出於某種原因,例外被稱爲「例外」;你應該只使用它們來處理異常的情況。
還有一點需要注意的是,在Visual Studio調試/輸出窗口中記錄(可選)異常。即使異常的性能開銷可能微不足道,但在調試時爲每個異常寫入一行文本都會使事情減慢。在失敗的整數解析操作的噪音中,更多值得注意的例外也可能被淹沒。
如果這的確是預期的轉換有時會失敗,我喜歡整齊地放在一個線路上使用int.TryParse
和這種與conditional (Ternary) operator,就像這樣:
int myInt = int.TryParse(myString, out myInt) ? myInt : 0;
在這種情況下,零將被用作如果TryParse方法失敗,則爲默認值。
也爲可空類型,如果轉換失敗,這將覆蓋任何默認值與null
真的很有用。
雖然我同意背景爲王的一般推力,但我會說TryParse *幾乎總是*更好,這比主觀的個人偏好略高一點。你的反例(區分不同的異常,可以拋出)是相當不尋常的,並有可能與每種類型的異常,而不是捕獲所有的catch塊可以更好地編碼。 – Joe 2011-02-09 17:51:04
@Joe:是的,如果你想在不同的異常類型來區分,什麼不是具體的catch塊,否則會顯得很奇怪。我的答案旨在討論`Parse` vs`TryParse`,而不是問題中的特定代碼示例。正如我在其他地方提到的,我同意`TryParse`幾乎總是最好的方式,但關鍵字是「幾乎」,而不是「永遠」。 – 2011-02-09 18:57:39
@Joe:我已經提出了這個觀點。請參閱評論交換原始問題。弗雷德裏克關於絕對言論的權利永遠不會是真的。 (OMG一個悖論!) – 2011-02-10 04:17:18