为什么C#条件运算符时出现堆栈溢出异常
本文关键字:堆栈 栈溢出 异常 条件运算符 为什么 | 更新日期: 2023-09-27 18:29:08
此代码导致堆栈溢出异常,我不确定原因。
public double? Value
{
get
{
return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null;
}
set
{
Value = value;
}
}
因为在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,然后。。。你明白重点了。