0

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

    private float _voltageRange
    {
        get { return _voltageRange + ((10F/100F)*_voltageRange); }
        set { _voltageRange = value; }
    }

我该如何解决这个问题?不是编译器会自动创建一个支持字段吗?

我想要实现的是返回_VoltageRange自身的 10%。

4

3 回答 3

11

你的 getter 和你的 setter 都递归地调用自己。

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

public float VoltageRange { get; set; }

每当您提供 getter/setter 主体时,您都必须自己完成。

听起来你想要:

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

或者更简单地说:

private float _voltageRange;
private float VoltageRange
{
    get { return (_voltageRange * 11) / 10; }
    set { _voltageRange = value; }
}

(或者只是乘以 1.1f,但这会增加数据丢失的可能性。)

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

VoltageRange = VoltageRange;

将是无操作的。这是大多数读者所期望的。

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

private VoltageRange { get; set; }

private EffectiveVoltageRange { get { return VoltageRange * 1.1f; } }
于 2012-08-01T19:13:37.577 回答
1

将您的代码更改为如下所示,这将解决您的问题

private float _voltageRange;

public float VoltageRange
{
  get { return _voltageRange + ((10F/100F)*_voltageRange); }
  set { _voltageRange = value; }
}
于 2012-08-01T19:15:37.507 回答
0

这是执行私有财产时 IL 的样子:

get__voltageRange:
IL_0000:  nop         
IL_0001:  call        UserQuery.get__voltageRange
IL_0006:  ldc.r4      CD CC CC 3D 
IL_000B:  call        UserQuery.get__voltageRange
IL_0010:  mul         
IL_0011:  add         
IL_0012:  stloc.0     
IL_0013:  br.s        IL_0015
IL_0015:  ldloc.0     
IL_0016:  ret         

set__voltageRange:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        UserQuery.set__voltageRange
IL_0007:  nop         
IL_0008:  ret       

您现在可以清楚地看到递归在调用中发生的位置

于 2012-08-01T19:53:18.197 回答