2010-05-27 32 views

回答

9

轉到read this(「Performance Profiling Parse vs. TryParse vs. ConvertTo」)獲取更多信息。

如果您不確定字符串是否可解析,那麼int.TryParse()將比其他任何一個更快,並捕獲異常。

0

兩個int.ParseConvert.Int32內部調用int.TryParse,所以他們之間的性能差異應該是微不足道的。 TryParse是最通用的,它允許您決定是否拋出異常,但其他方法之間沒有區別。

+2

實際上,如果你在Reflector中查看,int.Parse在內部調用Number.ParseInt32 ...它永遠不會調用int.TryParse。 – 2010-05-27 15:45:18

+0

我在想同樣的事情。我正要開放一些源代碼,但我會把你的信息作爲確認。 – Jaxidian 2010-05-27 15:46:12

0

Convert.ToInt32(string)calls Int32.Parse(string)。

但是,如果使用Int32.Parse(或等效的int.Parse),則可以指定解析時使用的全局化和格式。

Int.Parse會更快,因爲它不會執行try/catch。

Int.TryParse更可靠,不會拋出錯誤,如果您不通過它不可轉換的價值。

+0

其實,如果你在Reflector中查看,int.Parse在內部調用Number.ParseInt32 ...它永遠不會調用int.TryParse – 2010-05-27 15:49:49

+1

@Ed:誰說TryParse必須用Parse來實現,而不是反過來? – 2010-05-27 15:49:56

+1

這與Jaxidian引用的基準中寫的有些矛盾。根據這個,'int.Parse'不會更快。 – 2010-05-27 15:51:04

1

我個人使用

int.Parse(...) 

,如果我有一個字符串作爲源和

Convert.ToInt32(...) 

,如果我有一個VALUETYPE(雙,十進制)作爲源,否則我不得不投它串起來處理當地的文化。

+1

如果我想要解析一個字符串(即期望頁碼或API作爲查詢字符串參數的API)上引發的異常,我使用'int.Parse'。我使用'int.TryParse'來處理我正在解析的字符串,如果我想處理它然後在那裏。如果它不是一個字符串(不管它是一個小數,還是一個int在一個對象中,或者其他任何東西),我使用'Convert.ToInt32'。所以我和你在一起。 :-) – Jaxidian 2010-05-27 15:59:30

5

Convert.Int32()調用Int32.Parse()並加上一個空的檢查, 因此 Int32.Parse()可能會稍微快一點。 這就是爲什麼Convert.Int32()會更快(它在Int32.Parse()必須處理它之前捕獲空)。

Int32.Parse()在內部調用Number.ParseInt32(),當數字不能被解析時它會拋出異常。

Int32.TryParse()內部調用Number.TryParseInt32()Number.ParseInt32()具有類似的代碼,但不拋出異常,它只是返回false ...這引入了更少的開銷。

考慮到所有這些變量,我的猜測是Int32.TryParse()會給你非空值的最快結果。如果有機會大部分電話可能包含空值,我會說Convert.Int32()會表現更好。

...所有那些由.NET反射器的力量帶給你的。

+0

+1,但關於「所以Int32.Parse()可能會更快一點」:我想你將無法測量空值檢查。事實上,根據http://blogs.msdn.com/b/ianhu/archive/2005/12/19/505702.aspx,如果你的輸入是'null',它會變慢。「不同的是,正如我們猜測的那樣,在異常處理代碼中,這就是爲什麼Convert會比Parse更快,因爲Convert可以處理壞數據集中的空字符串,而不會引發異常。「 – 2010-05-27 15:52:48

+0

@ 0xA3更新了我的答案以反映評論。感謝您的收穫(和參考)。 – 2010-05-27 15:55:23

0

我發現答案取決於上下文。

如果我將某個DataRow轉換爲對象,則會有很多Convert.ToXXX調用,所以我會使用Convert.ToInt32,因爲這與該轉換的其他語句一致。

在其他情況下,如果我想在字符串不解析時拋出異常,我將使用int.Parse,因爲這會引發異常,而int.TryParse傾向於生成較醜陋的代碼(I'我從來沒有一個參數的粉絲)

如果我只是想指定一些默認值,如果字符串不解析,我會使用int.TryParse,否則,我將不得不自己處理這個異常,並且這既昂貴又醜陋。

但是,除非您打電話給解析網站數十億次,否則我會驚奇地發現三種格式之間存在明顯的時間差異,所以我寧願使用更可讀的代碼片段, 。