为什么我在C#条件运算符时遇到堆栈溢出异常?

时间:2016-01-05 06:28:43

标签: c#

此代码导致堆栈溢出异常,我不确定原因。

public double? Value
    {
        get
        {
            return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null;
        }
        set
        {
            Value = value;
        }
    }

3 个答案:

答案 0 :(得分:2)

因为在你的Get中你正在阅读该属性,导致无限循环。使用支持字段。

private double? _value;
public double? Value
{
    get { return _value.HasValue ? (double?) Math.Round(_value.Value, 1) : null; }
    set { _value = value; }
}

编辑:我还想指出,很容易证明这是非常糟糕的代码。首先,暴露公共制定者有点开始,它只比公共领域好一点。此外,使用代码可以很容易地将一个东西分配给变量,但是如果你在后面的行上检查它,则值已经改变了。我会考虑将舍入逻辑移入setter,删除可空性(如果适用),完全删除可变性(再次,如果适用)并在构造函数中注入值。

答案 1 :(得分:2)

因为在setter中你要为setter赋值,这意味着再次调用setter。 setter一直调用自己因此stackoverflow异常。吸气剂也一样。

您应该有一个实数变量来存储值:

public double? Value
{
    get
    {
       return myValue.HasValue ? (double?)Math.Round(myValue.Value, 1) : null;
    }
    set
    {
       myValue = value;
    }
}

private double? myValue;

答案 2 :(得分:0)

嗯,您的财产存在问题:

您必须使用支持字段,否则您将无法存储/获取您的价值。

您的代码变为:

countPaths()

你的例外将会消失。

您的堆栈溢出异常来自Math.Round(Value.Value,1)。

您正在尝试获取您的财产的价值。所以,你打电话给你的getter来获得这个价值。然后,再次点击 同一行,再次调用Math.Round(Value.Value,1)。

然后,再次调用吸气剂,然后...... 你明白了这一点。