c# - 重载 "Set to equal to"运算符

标签 c# .net struct operator-overloading

我正在阅读 Business Primitives由 CodeBetter.com 开发,正在考虑这个想法。

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

我的意思是这样做:

Money myMoney = 100.00m;

代替:

Money myMoney = new Money(100.00m);

我了解如何覆盖所有运算符以允许执行数学等功能,但我不知道需要覆盖什么才能允许我尝试执行的操作。

这样做的想法是尽量减少实现新类型时所需的代码更改,并保持它是原始类型的想法,只是具有不同的值类型名称和业务逻辑功能。

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

最佳答案

您可以提供 implicit cast operatordecimalMoney 像这样:

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/

相关文章:

c# - 优化 GridView

c# - 使用 Linq 从 XML 填充类

.net - MySQL .NET 连接器 - 获取该列所属的表?

c - "Dereferencing pointer to incomplete type", typedefs 没问题

c - 访问嵌套结构成员的多种方式

c# - 为 XNA C# 游戏制作带有补丁/更新的单文件可视化可定制安装程序

c# - 是什么导致我的 ASP.NET MVC/AJAX 网站上出现这些 SQL 转换错误? [视频显示问题]

c# - 如何删除当前绑定(bind)到控件的工具提示?

.net - 有没有办法衡量装箱/拆箱处罚?

c++ - 如何使用dlang读取二进制文件数据