2010-01-30 87 views
2

我正在閱讀CodeBetter.com的Business Primitives,並且正在醞釀這個想法。以他的Money爲例,如何以一種與常規值類型類似的方式實現這個功能?重載「設置爲等於」運算符

我的意思是這樣:

Money myMoney = 100.00m; 

相反的:

Money myMoney = new Money(100.00m); 

我明白如何覆蓋所有運營商允許的功能做數學等等,但我不」不知道需要重寫什麼以允許我正在嘗試做什麼。

這樣做的想法是最大限度地減少實現新類型時所需的代碼更改,並保持原來的類型不變,只需使用不同的值類型名稱和業務邏輯功能。

理想情況下,我會繼承Integer/Float/Decimal或任何必需的,並根據需要重寫,但顯然不適用於結構。

回答

7

更清晰,您可以提供從decimalimplicit cast operatorMoney像這樣:

class Money { 
    public decimal Amount { get; set; } 
    public Money(decimal amount) { 
     Amount = amount; 
    } 
    public static implicit operator Money(decimal amount) { 
     return new Money(amount); 
    } 
} 

用法:

Money money = 100m; 
Console.WriteLine(money.Amount); 

現在,這裏發生的不是我們正在重載賦值運算符;這在C#中是不可能的。相反,我們正在做的是提供一個操作員,可以在必要時隱式投射decimalMoney。在這裏,我們試圖將100m的十進制文字分配給Money類型的實例。然後,在幕後,編譯器將調用我們定義的隱式轉換運算符,並使用該轉換運算符將轉換結果分配給Money的實例money。如果您想了解其中的機制,請閱讀C#3.0規範的第7.16.1節和第6.1節。

請注意,模型貨幣的類型應爲decimal,如上所示。

+0

啊哈,這就是我一直在尋找! 是否有可能將其隱式轉換爲它所分配的類型? 我可以舉例: decimal dec = myMoney; – 2010-01-30 03:50:23

+0

@Aquitarum Custos:是的,你完全可以。只要說'公共靜態隱式操作符小數(金錢){return money.Amount; }'然後'小數d =金錢'是完全合法的。因此,你必須要說的魔術詞是「公共靜態隱式運算符」,然後你給出返回類型(所以這裏是'decimal'),然後,作爲運算符的單個參數,你想要轉換的類型的參數所以在這裏'錢')。請注意,返回類型或參數類型之一必須是封閉類的類型。因此'public static implicit operator string(int i)'是不合法的。 – jason 2010-01-30 04:02:19

+0

很高興知道它的雙向作用,謝謝! – 2010-01-30 04:23:52

0

賦值運算符不能在C#中定義,但對於這種類型的賦值,你可以重載隱式類型轉換操作符:

(Money類內)

public static implicit operator Money(double value) 
{ 
    return new Money(value); 
} 

注:我推薦使用準確的貨幣計算小數點

+1

請不要使用雙重代表金錢! – 2010-01-30 03:42:40

+0

@丹這就是爲什麼有一個筆記,用戶使用雙字面。 – 2010-01-30 03:49:57

+0

對不起,當我打字時,那個筆記不在那裏。 – 2010-01-30 07:41:51