在 C# 中设置支持字段中的值相乘

Multiply Value in Set Backing Field in C#

我希望在 C# 的 set 支持字段中乘以一个值(对于 ASP.NET MVC 应用程序)。我这样做是为了避免 issues with dividing floating point numbers,因此属性是整数,为了外观需要进行乘法和除法,然后存储为小数。

answer here 之后,我正在尝试使用支持字段在 属性 上完成这些操作,如下所示:

public decimal SomeDecimal
{
    get
    {
        return this.SomeDecimal / 100;
    }
    set
    {
        this.SomeDecimal = this.SomeDecimal * 100;
    }
}

我收到以下警告:

Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

任何人都可以解释在视图/控制器中不这样做的正确乘法和除法方法。

支持字段是独立于您的 属性 的成员。它通常被声明为私有的,与 属性 具有相同的类型,并且具有相同的名称,但采用驼峰式命名或带有下划线:

private decimal someDecimal;

然后,您的 属性 被定义为读取和写入该字段。在 setter 的情况下,您使用关键字 value 来获取分配给 属性 的值:

public decimal SomeDecimal
{
    get
    {
        return this.someDecimal / 100;
    }
    set
    {
        this.someDecimal = value * 100;
    }
}

编辑:您对浮点运算精度损失的担忧在这种情况下可能不适用。与 floatdouble 以 2 进制表示形式存储不同,decimal 以 10 进制表示存储。如果您执行简单的算术计算(例如求和)在合理的货币价值上有两个小数位——该类型就是为此目的而设计的。

当您在 getter 和 setter 中为 SomeDecimal 引用 this.SomeDecimal 时,您正在创建无限递归。

您想创建一个存储真实值的私有字段,然后使用 属性 获取并根据您的方案设置它 multiplying/dividing 它。

private decimal _someDecimal;
public decimal SomeDecimal
{
    get
    {
        return _someDecimal / 100;
    }
    set
    {
        _someDecimal = value * 100;
    }
}