https://www.cnblogs.com/leolis/p/3968943.html
在編程過程中,數(shù)據(jù)轉(zhuǎn)換是經(jīng)常要用到的,C#中數(shù)據(jù)轉(zhuǎn)換的方法很多,拿將目標(biāo)對(duì)象轉(zhuǎn)換為整型(int)來講,有四種方法:分別為(int)、int.Parse()、int.TryParse()和Convert.ToInt32(),那么這四種方法對(duì)被轉(zhuǎn)換對(duì)象有什么限制,以及各自之間有什么區(qū)別呢?相信很多童鞋也不能完全說清楚。
下面從被轉(zhuǎn)換對(duì)象說起,在我們實(shí)際開發(fā)項(xiàng)目的過程中,我們碰到需要被轉(zhuǎn)換的類型大概有3大類,分別是空值(NULL)、數(shù)字類型(包含float,double,int,long等)和字符串(string)這3類。
先看第一種情況:NULL,采用如下代碼進(jìn)行測(cè)試:
int a = Convert.ToInt32(null);
int b;
bool rlt = int.TryParse(null, out b);
int c = int.Parse(null);
int d = (int)null;
很明顯,在運(yùn)行之前VS就會(huì)在最后一句報(bào)錯(cuò):“Cannot convert null to 'int' because it is a non-nullable value type”,這是說不能將NULL轉(zhuǎn)換為INT因?yàn)镮NT是一個(gè)非空值類型,然后注釋掉最后一句,再運(yùn)行一下,發(fā)現(xiàn)這一句(int c = int.Parse(null);)會(huì)報(bào)如下錯(cuò)誤:“Value cannot be null.”,值不能為空,a和b分別返回0,rlt為false;
然后繼續(xù)看第二種情況:數(shù)字類型(主要測(cè)試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;
然后運(yùn)行一下,發(fā)現(xiàn)這一句(int c = int.Parse(m.ToString());)會(huì)報(bào)錯(cuò):“Input string was not in a correct format.”,輸入的字符串格式不正確,注釋掉這一句然后運(yùn)行,然后查看返回值,a=1,b=0,rlt=false,d=1,將m的值修改為1.532d后再運(yùn)行一次,查看結(jié)果為a=2,b=0,rlt=false,d=1;下面測(cè)試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;
運(yùn)行后發(fā)現(xiàn)(int a = Convert.ToInt32(m);)和(int c = int.Parse(m.ToString());)報(bào)錯(cuò):“Value was either too large or too small for an Int32.”,值對(duì)于Int32太大或太小,其他返回結(jié)果b=0,rlt=false,d=-1;
下面繼續(xù)看第三種情況:字符串,同樣修改代碼如下:
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;
發(fā)現(xiàn)最后一句(int d = (int)m;)報(bào)錯(cuò):“Cannot convert type 'string' to 'int'”,不能轉(zhuǎn)換string到int類型,同樣注釋掉這句再運(yùn)行,發(fā)現(xiàn)(int a = Convert.ToInt32(m);)和(int c = int.Parse(m);)均報(bào)如下的錯(cuò)誤:“Input string was not in a correct format.”,輸入的字符串格式不正確,只有將m的值修改為整型的字符串(如:”12”)才不會(huì)報(bào)如此錯(cuò)誤。
好了,測(cè)試做完了,下面進(jìn)行總結(jié):
1)對(duì)于轉(zhuǎn)換對(duì)象,Convert.ToInt32()可以為多種類型(例出數(shù)字類型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串類型(即各種整型ToString()之后的形式,不能為浮點(diǎn)型,否則int.Parse()就會(huì)出現(xiàn)輸入的字符串格式不正確的錯(cuò)誤,int.TryParse()也會(huì)返回false,輸出參數(shù)為0),(int)只能是數(shù)字類型(例float,int,uint等);
2)對(duì)于空值NULL,從運(yùn)行報(bào)錯(cuò)的角度講,(int)強(qiáng)制轉(zhuǎn)換和int.Parse()都不能接受NULL;Convert.ToInt32()其實(shí)是在轉(zhuǎn)換前先做了一個(gè)判斷,參數(shù)如果為NULL,則直接返回0,否則就調(diào)用int.Parse()進(jìn)行轉(zhuǎn)換,int.TryParse()其實(shí)是對(duì)int.Parse()做了一個(gè)異常處理,如果出現(xiàn)異常則返回false,并且將輸出參數(shù)返回0;
3)針對(duì)于浮點(diǎn)型的取舍問題,浮點(diǎn)型只有Convert.ToInt32()和(int)能進(jìn)行轉(zhuǎn)換,但是也是進(jìn)行取舍了的,Convert.ToInt32()采取的取舍是進(jìn)行四舍五入,而(int)則是截取浮點(diǎn)型的整數(shù)部分,忽略小數(shù)部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d還是返回1;
4)關(guān)于溢出,將大的數(shù)據(jù)類型轉(zhuǎn)換為小的數(shù)據(jù)類型時(shí)Convert.ToInt32()和int.Parse()都會(huì)報(bào)溢出錯(cuò)誤,值對(duì)于Int32太大或太小,而(int)不報(bào)錯(cuò),但是返回值為-1。
如此可見,我們?cè)谶M(jìn)行數(shù)據(jù)轉(zhuǎn)換前選擇轉(zhuǎn)換方法要謹(jǐn)慎,如果是數(shù)字類型可以考慮直接用(int)強(qiáng)制轉(zhuǎn)換,如果是整型字符串類型的,考慮用int.Parse()進(jìn)行轉(zhuǎn)換,如果不是這兩種類型,再考慮用Convert.ToInt32()進(jìn)行轉(zhuǎn)換。
聯(lián)系客服