实例化时出现StackOverflow错误

本文关键字:StackOverflow 错误 实例化 | 更新日期: 2023-09-27 17:50:42

每当我在c#中实例化该类时,我都会得到StackOverflow错误。有人能解释一下原因吗?

class Money
{
    public Money(decimal value, Currency usedCurrency)
    {
        Value = value;
        UsedCurrency = usedCurrency;
    }
    public decimal Value
    {
        get { return Value; }
        set { Value = Math.Round(value, 2, MidpointRounding.ToEven); }
    }
    public Currency UsedCurrency;
}
public enum Currency
{
    USD,
    EUR,
    GBP,
    CAD,
    AUD
}

下面是一个实例化示例:

var money = new Money(100, Currency.USD);

实例化时出现StackOverflow错误

您的属性正在引用自己。当你试图得到Value时,它指的是Value…它试图再次获得Value…等等。

public decimal Value
{
    get { return Value; }
    set { Value = Math.Round(value, 2, MidpointRounding.ToEven); }
}

使用后备字段。(另外,我会将您的属性重命名为更有意义的东西,特别是因为value有特殊的含义。)

private decimal roundedCurrency;
public decimal RoundedCurrency
{
    get { return roundedCurrency; }
    set { roundedCurrency = Math.Round(value, 2, MidpointRounding.ToEven); }
}

您需要为您的属性Value添加一个后备字段。在您当前的代码中,get/set的属性试图设置属性,从而引入递归调用和Stackoverflow异常。

private decimal _Value;
public decimal Value
{
    get { return _Value; }
    set { _Value = Math.Round(value, 2, MidpointRounding.ToEven); }
}