重载“设置为等于”运算符

时间:2010-01-30 03:34:46

标签: c# .net struct operator-overloading

我正在通过CodeBetter.com阅读Business Primitives并正在考虑这个想法。

以他的Money为例,如何以类似于常规值类型的方式实现它?

我的意思是这样做:

Money myMoney = 100.00m;

而不是:

Money myMoney = new Money(100.00m);

我理解如何覆盖所有运算符以允许执行数学等功能,但我不知道需要覆盖什么来允许我正在尝试做的事情。

这样做的想法是最小化实现新类型时所需的代码更改,并保持它是基本类型的相同想法,只需使用不同的值类型名称和业务逻辑功能。

理想情况下,我会继承Integer / Float / Decimal或任何需要的东西,并根据需要覆盖,但显然结构不可用。

3 个答案:

答案 0 :(得分:7)

您可以提供从decimalMoney的{​​{3}},如下所示:

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#中是不可能的。相反,我们正在做的是提供一个可以在必要时隐式地将decimal强制转换为Money的运算符。在这里,我们尝试将十进制文字100m分配给类型为Money的实例。然后,在后台,编译器将调用我们定义的隐式强制转换运算符,并使用它将转换结果分配给money的实例Money。如果您想了解其机制,请阅读C#3.0规范的§7.16.1和§6.1。

请注意,如上所示,模拟金钱的类型应该是decimal

答案 1 :(得分:0)

答案 2 :(得分:0)

无法在C#中定义赋值运算符,但是对于这种赋值,您可以重载隐式强制转换运算符:

(在Money课程内)

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

注意:我建议使用小数进行准确的货币计算