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()进行转换。

相关文章
相关标签/搜索