System.Convert.ToInt与(int)
我在另一篇文章中注意到,有人做了类似的事情:
double d = 3.1415; int i = Convert.ToInt32(Math.Floor(d));
他们为什么使用convert函数,而不是:
double d = 3.1415; int i = (int)d;
它具有一个隐式底限和转换。
另外,更令人担忧的是,我在阅读的一些生产代码中注意到:
double d = 3.1415; float f = Convert.ToSingle(d);
是否与以下内容相同:
float f = (float)d;
是否所有其他隐式转换都只是为了实现完整性而在Convert类中进行,还是它们有目的?我可以理解对.ToString()的需求,但其余的却不然。
解决方案
当我们有一个要转换为int的字符串时,可以使用Convert
int i = Convert.ToInt32("1234");
如果转换和转换都失败,则都将引发异常。
也就是说,这仍然会引发异常,并且不会返回0:
Convert.ToInt32("1234NonNumber");
在许多情况下,转换和强制转换将具有相同的结果,但是强制转换通常更易于阅读。
强制转换为int是隐式截断,而不是隐式地板:
double d = -3.14; int i = (int)d; // i == -3
我选择Math.Floor或者Math.Round来使我的意图更加明确。
Convert.ToInt32()用于字符串(http://msdn.microsoft.com/zh-cn/library/sf1aw27b.aspx),而强制转换只能用于具有内部转换器的类型(数字类型)。真正的诀窍在于确定Int32.Parse和Convert.ToInt32()之间的关系。 Convert.ToInt32()允许使用null参数,并返回0,而Int32.Parse()将引发ArgumentNullException。
四舍五入的处理方式也不同:
x = -2.5(int)x = -2 Convert.ToInt32(x)=-2
x = -1.5(int)x = -1 Convert.ToInt32(x)=-2
x = -0.5(int)x = 0 Convert.ToInt32(x)= 0
x = 0.5(int)x = 0 Convert.ToInt32(x)= 0
x = 1.5(int)x = 1 Convert.ToInt32(x)= 2
x = 2.5(int)x = 2 Convert.ToInt32(x)= 2
注意x = -1.5和x = 1.5的情况。
在某些算法中,使用舍入方法对于获得正确答案至关重要。