2012-05-11 91 views
10

什麼,如果有的話,是什麼區別?C#鑄造成小數點

decimal d = (decimal) myDouble; 
decimal d = new decimal(myDouble); 
decimal d = Convert.ToDecimal(myDouble); 

回答

8

沒有區別。如果你看看源:

十進制:

public static explicit operator decimal(double value) 
{ 
    return new decimal(value); 
}  

在轉換:

public static decimal ToDecimal(float value) 
{ 
    return (decimal) value; 
} 

所以最後他們都呼籲new decimal(double)

+0

但是'(十進制)值和'新的十進制(值)'可能有區別:第一個調用內置的雙十進制轉換運算符,而第二個調用小數構造函數的重載。當然,本地代碼可能是相同的,但IL可能不同,而C#語義肯定不同。 – phoog

+2

@phoog兩者之間沒有區別。沒有「內置」雙十進制轉換運算符,答案中提供的第一種方法是被調用的方法。你提供的第一種方式只是調用第二種方法來向調用樹提供一種方法。 – JKor

+0

@JKor我沒有提供任何方法;我只是評論。 – phoog

4

它們都達到了相同的結果。但是,這裏有一個更細分的解釋:

  • 方法1創建一個新的變量,它明確地把myDouble鍵入decimal。當你施放時,你的意思是,「這個類型A的對象實際上是一個B類派生自A的對象,或者存在一個用於將A施放到B的施法操作符。」

  • 方法2創建一個新的變量,它通過一個構造過載myDouble轉換成適當的類型(decimal)。當你調用一個構造函數時,你會說,「根據傳入構造函數的參數創建一個新對象。」

  • 方法3轉換基本數據類型(double)到另一個基站的數據類型(decimal)。 當您使用類似Convert.ToDecimal()的東西時,您的意思是,「這個對象不是B類型的,但有一種方法可以使它成爲B類型的對象。」

關於Convert MSDN規定:

  • 的轉換方法存在於每個基類型轉換爲每個其它基本類型。但是,實際執行的轉換操作分爲三類:

  • 從類型到自身的轉換隻是返回該類型。實際上沒有轉換。

  • 無法產生有意義的結果的轉換會引發InvalidCastException。實際上沒有轉換。從Char到Boolean,Single,Double,Decimal或DateTime以及從這些類型到Char的轉換都會引發異常。從DateTime到除String之外的任何類型的轉換以及從String到DateTime之外的任何類型都會引發異常。除上述之外的任何基本類型都可以轉換爲任何其他基本類型,也可以轉換爲任何其他基本類型。
+0

示例2顯示了構造函數重載。此外,示例1中的演員示例不是根據您的定義進行演員表演,因爲當然,小數不是來自雙倍(也不是相反)。相反,C#轉換運算符有兩個功能:(1)表示保留類型的引用類型轉換和(2)調用內置或用戶定義的顯式(或隱式)轉換。 – phoog

3

實際上,從功能的角度來看,沒有任何區別。 這些是實現結果相同的不同方式。

重要的是,在Convert.ToDecimal的情況下,您可以指定格式IFormatProvider(culture),這樣您可以獲得更大的靈活性。

如果您不在乎多元文化環境,請選擇您喜歡的任何一種。

+1

我想IFormatProvider在這裏被忽略,因爲輸入和輸出都不是字符串。 – phoog

+0

是的,正確的。注意是關於使用的一般可能差異 – Tigran