为什么C#条件运算符时出现堆栈溢出异常

本文关键字:堆栈 栈溢出 异常 条件运算符 为什么 | 更新日期: 2023-09-27 18:29:08

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

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

为什么C#条件运算符时出现堆栈溢出异常

因为在Get中,您正在读取属性,从而导致无限循环。使用背景字段。

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

编辑:我还想指出,很容易证明这是非常糟糕的代码。首先,揭露公共设置者一开始就有点不确定,这只比拥有一个公共领域好一点。此外,使用可以为变量分配一件事的代码确实很令人困惑,但如果在之后的行中检查它,则值已经更改。我会考虑将舍入逻辑移动到setter中,删除可空性(如果适用),完全删除可变性(如果适用,再次),并在构造函数中注入值。

因为在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;

好吧,您的财产有问题:

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

您的代码变为:

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

你会离开的。

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

你正在努力获得你的财产的价值。所以,你调用getter来获得这个值。然后,在同一行再次点击,然后再次调用Math.Round(Value.Value,1)。

然后,它再次调用getter,然后。。。你明白重点了。