System.Convert.ToInt与(int)

时间:2020-03-06 14:27:05  来源:igfitidea点击:

我在另一篇文章中注意到,有人做了类似的事情:

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的情况。
在某些算法中,使用舍入方法对于获得正确答案至关重要。