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就会在最后一句报错
然后注释掉最后一句,再运行一下,发现这一句(int c = int.Parse(null);)会报如下错误:
a和b分别返回0,rlt为false;
总结:
- 对于空值NULL,从运行报错的角度讲,(int)强制转换和int.Parse()都不能接受NULL;
- Convert.ToInt32()其实是在转换前先做了一个判断,参数如果为NULL,则直接返回0;
- int.TryParse()其实是对int.Parse()做了一个异常处理,如果出现异常则返回false,并且将输出参数返回0;
第二种情况:数字类型(主要测试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());)会报错:
注释掉这一句然后运行,然后查看返回值,a=1,b=0,rlt=false,d=1,
将m的值修改为1.532d后再运行一次,查看结果为a=2,b=0,rlt=false,d=1;
总结
针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,
但是也是进行取舍了的,Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d还是返回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());)报错:
其他返回结果b=0,rlt=false,d=-1;
总结:
将大的数据类型转换为小的数据类型时Convert.ToInt32()和int.Parse()都会报溢出错误,值对于Int32太大或太小,而(int)不报错,但是返回值为-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;)报错:
同样注释掉这句再运行,发现(int a = Convert.ToInt32(m);)和(int c = int.Parse(m);)均报如下的错误,只有将m的值修改为整型的字符串(如:”12”)才不会报如此错误
总结:
Convert.ToInt32()可以为多种类型(例出数字类型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串类型(即各种整型ToString()之后的形式,不能为浮点型,否则int.Parse()就会出现输入的字符串格式不正确的错误,int.TryParse()也会返回false,输出参数为0),(int)只能是数字类型(例float,int,uint等);
原文链接:https://blog.csdn.net/alayeshi/article/details/79460312