3

次のゲッターとセッターを使用してプロパティ i を作成しようとしています。私が試してみました:

    int i { 
        get{
            return i;   
        }
        set {
            if (value > 60) {
            } else { 
                i = value; 
            } 
        }

    }

ただし、これを試してみると、コードを実行しようとするとスタック オーバーフロー エラーが発生します。私のコードに何か問題がありますか? 任意のアシスタントをいただければ幸いです。

4

5 に答える 5

5

プロパティに何らかのロジックがある場合は、バッキング フィールドが必要です (それ以外の場合は自動プロパティが適しています)。現在、セッター コードを再度呼び出すプロパティ自体に割り当てています (ゲッターの場合も同様)。スタック オーバーフローの例外。

例:

private int _i;
public int SomeProperty
{
  get{ return _i;}
  set 
  {
     //your logic here
     _i = value; 
  }
}
于 2012-10-06T04:49:14.170 に答える
4

これを行う:

private int i; // backing field

int I
{ 
    get
    {
        return i;   
    }
    set
    {
        if (value > 60) {
        } else
        { 
            i = value; 
        } 
    }
}

これを行わないと、コードが循環状態に保たれるため、StackOverflowエラーが発生します。

于 2012-10-06T04:49:51.153 に答える
2

この先

private int i = 0;
public int I
{
    get
    {
        return i;
    }
    set
    {
        if (value > 60)
        {
        }
        else
        {
            i = value;
        }
    }
}

いくつかのコーディング命名規則に従ってください。

  1. プロパティは MyProperty のような PascalCase です
  2. プライベート フィールドは、localVariable のようなキャメル ケースです。

詳細については、こちらをお読みください

于 2012-10-06T04:51:31.700 に答える
1

次のコードを使用するだけです。

int i;

public int I 
{ 
    get { return i; }
    set { if (value <= 60) i = value; } 
}

あなたのコードの問題は、ゲッター/セッターの本体内で自分自身を参照していたプロパティで i を指定し、循環効果になり、最終的に StackOverflow エラーになったことです。

于 2012-10-06T04:54:42.957 に答える
1
int i { 
    get{
        return i;   
    }
    set {
        ...
        i = value; 
        ...
    }
}

上記のコードでは、get ブロックと set ブロック内で同じプロパティ名を使用しています。

コンパイル後、コードは次のようなものに変換されます。

int get_i()
{
 return get_i();
}

void set_i(int value)
{
 set_i(value);
}

ご覧のとおり、それぞれが終了条件なしで無限に自分自身を呼び出し (再帰)、StackOverflow例外が発生します。

この質問に対する他の回答が示唆しているように、プロパティにバッキングフィールドがある場合、コンパイラはこれと同等のものを生成しますが、これには再帰はありません。

int get_i()
{
 return _i; //_i is the backing field
}

void set_i(int value)
{
 _i = value;
}

アップデート:

完全を期すために、ここに問題を解決する方法を追加します。

int _i;
int i { 
    get{
        return _i;   
    }
    set {
        if (value > 60) {
        } else { 
            _i = value; 
        } 
    }
}
于 2012-10-06T06:07:52.203 に答える