C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的區別

原文鏈接:https://www.cnblogs.com/leolis/p/3968943.html

在編程過程中,數據轉換是經常要用到的,C#中數據轉換的方法很多,拿將目標對象轉換爲整型(int)來講,有四種方法:分別爲(int)、int.Parse()、int.TryParse()和Convert.ToInt32(),那麼這四種方法對被轉換對象有什麼限制,以及各自之間有什麼區別呢?相信很多童鞋也不能完全說清楚。

下面從被轉換對象說起,在我們實際開發項目的過程中,我們碰到需要被轉換的類型大概有3大類,分別是空值(NULL)、數字類型(包含float,double,int,long等)和字符串(string)這3類。

先看第一種情況:NULL,採用如下代碼進行測試:

int a = Convert.ToInt32(null);
int b;
bool rlt = int.TryParse(null, out b);
int c = int.Parse(null);
int d = (int)null;

很明顯,在運行之前VS就會在最後一句報錯:“Cannot convert null to 'int' because it is a non-nullable value type”,這是說不能將NULL轉換爲INT因爲INT是一個非空值類型,然後註釋掉最後一句,再運行一下,發現這一句(int c = int.Parse(null);)會報如下錯誤:“Value cannot be null.”,值不能爲空,a和b分別返回0,rlt爲false;

然後繼續看第二種情況:數字類型(主要測試double和long類型),先將代碼修改如下:

double m = 1.232d;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;

然後運行一下,發現這一句(int c = int.Parse(m.ToString());)會報錯:“Input string was not in a correct format.”,輸入的字符串格式不正確,註釋掉這一句然後運行,然後查看返回值,a=1,b=0,rlt=false,d=1,將m的值修改爲1.532d後再運行一次,查看結果爲a=2,b=0,rlt=false,d=1;下面測試long類型,將代碼修改爲:

long m = 9223372036854775807;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;

運行後發現(int a = Convert.ToInt32(m);)和(int c = int.Parse(m.ToString());)報錯:“Value was either too large or too small for an Int32.”,值對於Int32太大或太小,其他返回結果b=0,rlt=false,d=-1;

下面繼續看第三種情況:字符串,同樣修改代碼如下:

string m = "1.32";
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m, out b);
int c = int.Parse(m);
int d = (int)m;

發現最後一句(int d = (int)m;)報錯:“Cannot convert type 'string' to 'int'”,不能轉換string到int類型,同樣註釋掉這句再運行,發現(int a = Convert.ToInt32(m);)和(int c = int.Parse(m);)均報如下的錯誤:“Input string was not in a correct format.”,輸入的字符串格式不正確,只有將m的值修改爲整型的字符串(如:”12”)纔不會報如此錯誤。

好了,測試做完了,下面進行總結:

1)對於轉換對象,Convert.ToInt32()可以爲多種類型(例出數字類型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串類型(即各種整型ToString()之後的形式,不能爲浮點型,否則int.Parse()就會出現輸入的字符串格式不正確的錯誤,int.TryParse()也會返回false,輸出參數爲0),(int)只能是數字類型(例float,int,uint等);

2)對於空值NULL,從運行報錯的角度講,(int)強制轉換和int.Parse()都不能接受NULL;Convert.ToInt32()其實是在轉換前先做了一個判斷,參數如果爲NULL,則直接返回0,否則就調用int.Parse()進行轉換,int.TryParse()其實是對int.Parse()做了一個異常處理,如果出現異常則返回false,並且將輸出參數返回0;

3)針對於浮點型的取捨問題,浮點型只有Convert.ToInt32()和(int)能進行轉換,但是也是進行取捨了的,Convert.ToInt32()採取的取捨是進行四捨五入,而(int)則是截取浮點型的整數部分,忽略小數部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d還是返回1;

4)關於溢出,將大的數據類型轉換爲小的數據類型時Convert.ToInt32()和int.Parse()都會報溢出錯誤,值對於Int32太大或太小,而(int)不報錯,但是返回值爲-1。

如此可見,我們在進行數據轉換前選擇轉換方法要謹慎,如果是數字類型可以考慮直接用(int)強制轉換,如果是整型字符串類型的,考慮用int.Parse()進行轉換,如果不是這兩種類型,再考慮用Convert.ToInt32()進行轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章