(int),Int32.Parse,Convert.ToInt32和Int32.TryParse区别
(int)是一种被称为强制转换的显示转换。源变量和目标变量必须是兼容的(必须都是int类型的)。并且有丢失数据的风险。因为目标变量的类型大小小于源变量。
从int到long、float、double或decimal的预定义隐式转换。例如:
//123是一个整数,它是隐式转换成float类型 float f = 123;
从sbyte、byte、short、ushort或char到int的预定义隐式转换。例如,如果不进行强制转换,下面的赋值语句将会在编译时报错:
long longTest = 22; //错误:无法将类型“long”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?) int i = longTest; int i2 = (int)longTest; //显示转换
但是还要注意,不存在从浮点型到int类型的隐式转换。例如,除非使用显式强制转换,否则以下语句将会在编译时报错:
//错误:无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?) int z = 3.5; //使强制类型转换,y的值是3,这也是上面所提到(int)强制类型转换有丢失数据的风险 int y = (int)3.5;
Int32.Parse方法仅允许将字符串转换成整型。
Convert.ToInt32(String,IFormatProvider)底层调用了Int32.Parse。然而假如我们传入一个空字符串会返回0.但是如果是传递给Int32.Parse就会抛出
ArgumentNullException异常。
我们可以通过.NET Reflector查看到这个静态的方法。
public static int ToInt32(string value, IFormatProvider provider) { if (value == null) { return 0; } return int.Parse(value, NumberStyles.Integer, provider); } 调用了int.Parse(value, NumberStyles.Integer, provider); 这个方法。
当源变量的值比Int32.MaxValue大或者比Int32.MinValue小,Convert.ToInt32会抛出OverflowExcetion异常。但是使用(int)则不会。
Convert.Toint32将舍入到最接近的32位有符号整数。如果值为中间两个的整体数字则返回偶数;这就是4.5转换为4,而5.5转换为6.而在另一方面
(int)只是截断小数部分。
最后来讲一讲Int32.TryParse。此方法是将字符串转换为等效的32位有符号整数。操作是否成功的返回值。
注意:它是一个bool的方法。
通过.NET Reflector查看。
public static bool TryParse(string s, out int result) { return Number.TryParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result); }
如果s转换成功,则为true;否则为false。示例:
string str = "w3"; int i; //输出转换失败 if (Int32.TryParse(str, out i)) { //转换成功 } else { //转换失败 }
上面我们定义的str的值是w3,所以它转换的时候去判断不是32位整数,则返回的是false。
注:TryParse方法类似Parse方法,不同之处在于TryParse方法转换失败时不引发异常。
(int)是一种被称为强制转换的显示转换。源变量和目标变量必须是兼容的(必须都是int类型的)。并且有丢失数据的风险。因为目标变量的类型大小小于源变量。
从int到long、float、double或decimal的预定义隐式转换。例如:
//123是一个整数,它是隐式转换成float类型 float f = 123;
从sbyte、byte、short、ushort或char到int的预定义隐式转换。例如,如果不进行强制转换,下面的赋值语句将会在编译时报错:
long longTest = 22; //错误:无法将类型“long”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?) int i = longTest; int i2 = (int)longTest; //显示转换
但是还要注意,不存在从浮点型到int类型的隐式转换。例如,除非使用显式强制转换,否则以下语句将会在编译时报错:
//错误:无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?) int z = 3.5; //使强制类型转换,y的值是3,这也是上面所提到(int)强制类型转换有丢失数据的风险 int y = (int)3.5;
Int32.Parse方法仅允许将字符串转换成整型。
Convert.ToInt32(String,IFormatProvider)底层调用了Int32.Parse。然而假如我们传入一个空字符串会返回0.但是如果是传递给Int32.Parse就会抛出
ArgumentNullException异常。
我们可以通过.NET Reflector查看到这个静态的方法。
public static int ToInt32(string value, IFormatProvider provider) { if (value == null) { return 0; } return int.Parse(value, NumberStyles.Integer, provider); } 调用了int.Parse(value, NumberStyles.Integer, provider); 这个方法。
当源变量的值比Int32.MaxValue大或者比Int32.MinValue小,Convert.ToInt32会抛出OverflowExcetion异常。但是使用(int)则不会。
Convert.Toint32将舍入到最接近的32位有符号整数。如果值为中间两个的整体数字则返回偶数;这就是4.5转换为4,而5.5转换为6.而在另一方面
(int)只是截断小数部分。
最后来讲一讲Int32.TryParse。此方法是将字符串转换为等效的32位有符号整数。操作是否成功的返回值。
注意:它是一个bool的方法。
通过.NET Reflector查看。
public static bool TryParse(string s, out int result) { return Number.TryParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result); }
如果s转换成功,则为true;否则为false。示例:
string str = "w3"; int i; //输出转换失败 if (Int32.TryParse(str, out i)) { //转换成功 } else { //转换失败 }
上面我们定义的str的值是w3,所以它转换的时候去判断不是32位整数,则返回的是false。
注:TryParse方法类似Parse方法,不同之处在于TryParse方法转换失败时不引发异常。