私有属性字段上的StackOverflow异常

Sae*_*ani 0 c# stack-overflow properties

有人可以告诉我为什么我会得到StackOverflowException下面的代码?

    private float _voltageRange
    {
        get { return _voltageRange + ((10F/100F)*_voltageRange); }
        set { _voltageRange = value; }
    }
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?是不是编译器会自动生成支持字段?

我想要实现的目标是回归_VoltageRange10%.

Jon*_*eet 11

你的getter和你的setter都会递归地调用它们.

不,编译器不会自动为您创建支持字段 - 除非您使用这样的自动实现的属性:

public float VoltageRange { get; set; }
Run Code Online (Sandbox Code Playgroud)

每当您提供的getter/setter机构,你必须做所有自己.

这听起来像你想要的:

private float _voltageRange;
private float VoltageRange
{
    get { return _voltageRange + ((10F/100F)*_voltageRange); }
    set { _voltageRange = value; }
}
Run Code Online (Sandbox Code Playgroud)

或者更简单:

private float _voltageRange;
private float VoltageRange
{
    get { return (_voltageRange * 11) / 10; }
    set { _voltageRange = value; }
}
Run Code Online (Sandbox Code Playgroud)

(或者只乘以1.1f,但数据丢失的可能性会更大.)

请注意,这是一个非常奇怪的属性 - 其中值集与检索的值不同.通常这个:

VoltageRange = VoltageRange;
Run Code Online (Sandbox Code Playgroud)

将是一个无操作.这是大多数读者所期望的.

拥有两个属性可能会更好,如下所示:

private VoltageRange { get; set; }

private EffectiveVoltageRange { get { return VoltageRange * 1.1f; } }
Run Code Online (Sandbox Code Playgroud)