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

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

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

先看第一種狀況:NULL,採用以下代碼進行測試:ui

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

很明顯,在運行以前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類型,將代碼修改成:string

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;it

運行後發現(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;form

下面繼續看第三種狀況:字符串,一樣修改代碼以下:

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()進行轉換。

相關文章
相關標籤/搜索