2008-09-19 37 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的情況爲例。
在一些算法中,所使用的舍入方法對獲得正確答案至關重要。