2012-08-01 103 views
0

有人可以告诉我为什么我得到StackOverflowException下面的代码?私人财产领域的StackOverflow例外

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

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

我想要的是将_VoltageRange加上本身的10%。

+0

我认为编译器只提供支持字段,如果你使用默认的getter/setter,例如{get;组; } – 2012-08-01 19:13:53

+0

递归调用是这里的问题/问题 – MethodMan 2012-08-01 19:14:07

+0

除了递归导致的问题之外,为什么使用'10F/100F'而不是'0.1F'? – 2012-08-01 19:18:23

回答

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; } 
} 

或者更简单:(或只是1.1F乘法,但将有数据丢失的多一点的可能性)

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

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

VoltageRange = VoltageRange; 

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

它可能会更好,有两个属性,就像这样:

private VoltageRange { get; set; } 

private EffectiveVoltageRange { get { return VoltageRange * 1.1f; } } 
+0

打我吧... – JonH 2012-08-01 19:15:41

+0

感谢乔恩,它让我感到困惑,在'get'我回来了一个方程,我没有把这个值赋给任何东西,我看不到'get'和'set'之间的连接。在我的代码中,或者它的方式! – 2012-08-01 19:16:58

+0

@ Sean87 - 正确的返回等式,但在该等式中,您一次又一次地调用您的私人领域...因此,stackoverflow。 – JonH 2012-08-01 19:18:02

1

更改您的代码看起来是这样,这将解决您的问题

private float _voltageRange; 

public float VoltageRange 
{ 
    get { return _voltageRange + ((10F/100F)*_voltageRange); } 
    set { _voltageRange = value; } 
} 
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  

你可以清楚地看到,现在这里的递归HAPP在调用