2012-08-01 138 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在調用