0

StackOverflowException以下のコードを取得する理由を教えてください。

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

この問題を解決するにはどうすればよいですか? コンパイラがバッキング フィールドを自動的に作成するのではありませんか。

_VoltageRange私が達成したいのは、自分のプラス10%を返すことです。

4

3 に答える 3

11

ゲッターとセッターの両方が再帰的に自分自身を呼び出します。

いいえ、コンパイラは自動的にバッキング フィールドを作成しません。次のように自動的に実装されたプロパティを使用しない限り、そうではありません。

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;

ノーオペレーションになります。これは、ほとんどの読者が期待することです。

次のように、2 つのプロパティを使用する方がよいでしょう。

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 に答える