2010-09-10 36 views
3
string s1 = "1234"; 
string s2 = "1234.65"; 
string s3 = null; 
string s4 = "123456789123456789123456789123456789123456789"; 

result = Int32.Parse(s1); //-- 1234 
result = Int32.Parse(s2); //-- FormatException 
result = Int32.Parse(s3); //-- ArgumentNullException 
result = Int32.Parse(s4); //-- OverflowException 

result = Convert.ToInt32(s1); //-- 1234 
result = Convert.ToInt32(s2); //-- FormatException 
result = Convert.ToInt32(s3); //-- 0 
result = Convert.ToInt32(s4); //-- OverflowException 

success = Int32.TryParse(s1, out result); //-- success => true; result => 1234 
success = Int32.TryParse(s2, out result); //-- success => false; result => 0 
success = Int32.TryParse(s3, out result); //-- success => false; result => 0 
success = Int32.TryParse(s4, out result); //-- success => false; result => 0 

From this link爲什麼我們需要太多的方法來執行相同的功能?

我們爲什麼需要這麼多的轉換功能在操作的意圖是隻將字符串轉換爲int。

如果我的問題很蠢,我很抱歉。

+5

呃..閱讀你從那裏得到的網頁上的文字?這是解釋.. – halfdan 2010-09-10 20:11:09

+0

@halfdan國際海事組織鏈接不解釋太多。 – 2010-09-10 20:18:15

回答

13

他們做3件不同的事情:

Int32.Parse()預計一個字符串,它是一個整數的確切表示。這是非常有限的 - 它要麼解析一個字符串或爆炸。

Int32.TryParse()與Parse相同,但有額外的開銷執行驗證。因此,如果您不確定傳入的字符串是否可解析,那麼它會比Parse好,並捕獲異常(非常昂貴)。但TryParse是浪費的情況下,你可以有一個簡單的Parse將高度自信。

Convert.ToInt32是最複雜的 - 它實際上確定傳入對象是否是可轉換,不可解析,爲int。它支持許多本地(已知)類型之間的轉換,但也檢查傳入的對象,以查看對象是否通過IConvertible提供了自己的邏輯,基本上說「是的,我可以轉換爲整數 - 以下是方式」。

+0

+1沒有意識到與Convert – heisenberg 2010-09-10 20:13:09

+2

的區別爲了完整起見,TryParse比Int32.Parse上的try/catch快得多。如果您正在進行大量可能會失敗的解析,則使用TryParse可能會爲您的應用程序帶來巨大的性能提升。 – 2010-09-10 20:14:53

+0

@Eduardo謝謝,我重新回答了這個問題,而非暗示。 – 2010-09-10 20:16:30

1

對於這些方法中的每一種都有性能折衷。

例如TryParse不會拋出異常,所以如果你必須做很多轉換,你應該使用該方法,然後檢查null,所以你需要通過性能命中實例化異常並捕獲它。

1

它們並不完全相同,它們的行爲略有不同。

例如 - TryParse模式將不會拋出異常,如果格式不正確,Try會。

在問候Convert VS Parse - 轉換將調用罩下Parse,與另外的一個檢查在null通過(0,如果null傳入它將返回)。

0

對於Int32.Parse,您剛剛提供了four overloads之一。這從分式上改變了角度。

也許Int32.Parse回調Convert方法。但是Convert也是一個簡單解析方法的獨立集合。由於例外情況相同,我想可能會調用Convert方法。

至於TryParse方法,我幾乎不會說他們執行相同的工作!

另見this link

相關問題