什麼,如果有的話,是什麼區別?C#鑄造成小數點
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
什麼,如果有的話,是什麼區別?C#鑄造成小數點
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
沒有區別。如果你看看源:
十進制:
public static explicit operator decimal(double value)
{
return new decimal(value);
}
在轉換:
public static decimal ToDecimal(float value)
{
return (decimal) value;
}
所以最後他們都呼籲new decimal(double)
。
它們都達到了相同的結果。但是,這裏有一個更細分的解釋:
方法1創建一個新的變量,它明確地把myDouble
鍵入decimal
。當你施放時,你的意思是,「這個類型A的對象實際上是一個B類派生自A的對象,或者存在一個用於將A施放到B的施法操作符。」
方法2創建一個新的變量,它通過一個構造過載myDouble
轉換成適當的類型(decimal
)。當你調用一個構造函數時,你會說,「根據傳入構造函數的參數創建一個新對象。」
方法3轉換基本數據類型(double
)到另一個基站的數據類型(decimal
)。 當您使用類似Convert.ToDecimal()
的東西時,您的意思是,「這個對象不是B類型的,但有一種方法可以使它成爲B類型的對象。」
關於Convert
MSDN規定:
的轉換方法存在於每個基類型轉換爲每個其它基本類型。但是,實際執行的轉換操作分爲三類:
從類型到自身的轉換隻是返回該類型。實際上沒有轉換。
示例2顯示了構造函數重載。此外,示例1中的演員示例不是根據您的定義進行演員表演,因爲當然,小數不是來自雙倍(也不是相反)。相反,C#轉換運算符有兩個功能:(1)表示保留類型的引用類型轉換和(2)調用內置或用戶定義的顯式(或隱式)轉換。 – phoog
實際上,從功能的角度來看,沒有任何區別。 這些是實現結果相同的不同方式。
重要的是,在Convert.ToDecimal的情況下,您可以指定格式IFormatProvider(culture),這樣您可以獲得更大的靈活性。
如果您不在乎多元文化環境,請選擇您喜歡的任何一種。
但是'(十進制)值和'新的十進制(值)'可能有區別:第一個調用內置的雙十進制轉換運算符,而第二個調用小數構造函數的重載。當然,本地代碼可能是相同的,但IL可能不同,而C#語義肯定不同。 – phoog
@phoog兩者之間沒有區別。沒有「內置」雙十進制轉換運算符,答案中提供的第一種方法是被調用的方法。你提供的第一種方式只是調用第二種方法來向調用樹提供一種方法。 – JKor
@JKor我沒有提供任何方法;我只是評論。 – phoog