哪一個更快,功能強大且可靠。爲什麼?哪一個處理和轉換更快int.Parse(),int.TryParse(),Convert.Int32()
int.Parse()
int.TryParse()
Convert.ToInt32()
哪一個更快,功能強大且可靠。爲什麼?哪一個處理和轉換更快int.Parse(),int.TryParse(),Convert.Int32()
int.Parse()
int.TryParse()
Convert.ToInt32()
轉到read this(「Performance Profiling Parse vs. TryParse vs. ConvertTo」)獲取更多信息。
如果您不確定字符串是否可解析,那麼int.TryParse()
將比其他任何一個更快,並捕獲異常。
兩個int.Parse
和Convert.Int32
內部調用int.TryParse
,所以他們之間的性能差異應該是微不足道的。 TryParse
是最通用的,它允許您決定是否拋出異常,但其他方法之間沒有區別。
Convert.ToInt32(string)calls Int32.Parse(string)。
但是,如果使用Int32.Parse(或等效的int.Parse),則可以指定解析時使用的全局化和格式。
Int.Parse會更快,因爲它不會執行try/catch。
Int.TryParse更可靠,不會拋出錯誤,如果您不通過它不可轉換的價值。
其實,如果你在Reflector中查看,int.Parse在內部調用Number.ParseInt32 ...它永遠不會調用int.TryParse – 2010-05-27 15:49:49
@Ed:誰說TryParse必須用Parse來實現,而不是反過來? – 2010-05-27 15:49:56
這與Jaxidian引用的基準中寫的有些矛盾。根據這個,'int.Parse'不會更快。 – 2010-05-27 15:51:04
我個人使用
int.Parse(...)
,如果我有一個字符串作爲源和
Convert.ToInt32(...)
,如果我有一個VALUETYPE(雙,十進制)作爲源,否則我不得不投它串起來處理當地的文化。
如果我想要解析一個字符串(即期望頁碼或API作爲查詢字符串參數的API)上引發的異常,我使用'int.Parse'。我使用'int.TryParse'來處理我正在解析的字符串,如果我想處理它然後在那裏。如果它不是一個字符串(不管它是一個小數,還是一個int在一個對象中,或者其他任何東西),我使用'Convert.ToInt32'。所以我和你在一起。 :-) – Jaxidian 2010-05-27 15:59:30
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反射器的力量帶給你的。
+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
@ 0xA3更新了我的答案以反映評論。感謝您的收穫(和參考)。 – 2010-05-27 15:55:23
我發現答案取決於上下文。
如果我將某個DataRow
轉換爲對象,則會有很多Convert.ToXXX
調用,所以我會使用Convert.ToInt32
,因爲這與該轉換的其他語句一致。
在其他情況下,如果我想在字符串不解析時拋出異常,我將使用int.Parse
,因爲這會引發異常,而int.TryParse
傾向於生成較醜陋的代碼(I'我從來沒有一個參數的粉絲)
如果我只是想指定一些默認值,如果字符串不解析,我會使用int.TryParse
,否則,我將不得不自己處理這個異常,並且這既昂貴又醜陋。
但是,除非您打電話給解析網站數十億次,否則我會驚奇地發現三種格式之間存在明顯的時間差異,所以我寧願使用更可讀的代碼片段, 。
實際上,如果你在Reflector中查看,int.Parse在內部調用Number.ParseInt32 ...它永遠不會調用int.TryParse。 – 2010-05-27 15:45:18
我在想同樣的事情。我正要開放一些源代碼,但我會把你的信息作爲確認。 – Jaxidian 2010-05-27 15:46:12