我正在阅读 Business Primitives由 CodeBetter.com 开发,正在考虑这个想法。
以他的 Money 为例,如何以一种类似于常规值类型的方式来实现它?
我的意思是这样做:
Money myMoney = 100.00m;
代替:
Money myMoney = new Money(100.00m);
我了解如何覆盖所有运算符以允许执行数学等功能,但我不知道需要覆盖什么才能允许我尝试执行的操作。
这样做的想法是尽量减少实现新类型时所需的代码更改,并保持它是原始类型的想法,只是具有不同的值类型名称和业务逻辑功能。
理想情况下,我会继承 Integer/Float/Decimal 或任何需要的东西,并根据需要覆盖,但显然这不适用于结构。
最佳答案
您可以提供 implicit cast operator从 decimal
到 Money
像这样:
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
under-the-hood,如我上面所示。
关于c# - 重载 "Set to equal to"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2166722/