2008-09-19 50 views
12

我在另一篇文章注意到,有人做了这样的:System.Convert.ToInt VS(INT)

double d = 3.1415; 
int i = Convert.ToInt32(Math.Floor(d)); 

他们为什么要使用转换功能,而不是:

double d = 3.1415; 
int i = (int)d; 

这有一个隐含的楼层和转换。

而且,更令人担心的,我注意到在某些生产代码,我正在读:

double d = 3.1415; 
float f = Convert.ToSingle(d); 

的是,同样为:

float f = (float)d; 

是所有那些否则隐式转换只是在Convert类为了完整性,还是他们有目的?我可以理解对.ToString()的需求,但不是其余。

回答

12

铸造到int是隐含截断,没有隐含的地板:

double d = -3.14; 
int i = (int)d; 
// i == -3 

我选择Math.Floor或Math.Round,使我的意图更加明确。

1

,当你有,你要转换成int

int i = Convert.ToInt32("1234"); 

转换和铸造都将抛出一个异常,如果他们没有一个字符串,您可以使用转换。

即,这仍然会抛出异常,它不会返回0:

Convert.ToInt32("1234NonNumber"); 

在许多情况下,转换和铸造都会有相同的结果,但投往往是次更容易阅读。

+0

'Int32.Parse(String):Int32'实际上是否将字符串转换为int? – 2008-09-19 18:18:26

1

Convert.ToInt32()用于字符串(http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx),而铸造只能用于具有内部转换器(数字类型)的类型。真正的技巧来决定Int32.Parse和Convert.ToInt32()之间。 Convert.ToInt32()容忍一个null参数并返回0,而Int32.Parse()将抛出一个ArgumentNullException。

3

舍入也不同的处理:

X = -2.5(INT)X = -2 Convert.ToInt32(X)= - 2
X = -1.5(INT)X = -1转换。 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的情况为例。
在一些算法中,所使用的舍入方法对获得正确答案至关重要。