プロパティC#のセット関数でネストされたクラスでstackoverflowexceptionエラーを取得しています

StackOverflow https://stackoverflow.com/questions/4269755

  •  28-09-2019
  •  | 
  •  

質問

public class Class1
    {
        public Class1()
        {
            prop = new Class2();
        }
        public Class2 prop { get; set; }

        public class Class2
        {
            public Class2()
            {
                this.prop2 = "nikola";
            }

            public string prop2 { get { return prop2; } set { prop2 = EditString(value); } }

            public string EditString(string str)
            {
                str += " plavsic";
                return str;
            }
        }
    }

これは私が問題を抱えている私のコードです。 Class1のタイプであるオブジェクトを初期化しようとすると、StackOverFlowExceptionエラーがスローされます。私は何が間違っているのですか?

役に立ちましたか?

解決

prop2はprop2を設定/返します... prop2のprop2の値を取得/設定するprop2を呼び出します。

これは、コンピューター/ランタイムがスペースがなくなり、コールスタックを保存するまで発生し続けます。

他のヒント

あなたの財産はそれ自体を設定しています。

この線 prop2 = ... プロパティセッターでは、プロパティセッターを呼び出します。プロパティセッターは再び自らを呼び出します。それ自体を再び呼び、それ自体を再び呼び、それは再びそれ自体を呼び、それ自体を再び呼び、それは再びそれ自体を呼び出します。もう一度自分自身を呼び出します...

ゲッターは同じことをしますが、あなたがそれを決して呼ばないことを除いて。

プロパティが取得して設定するには、バッキングフィールドを作成する必要があります。

例えば:

private string prop2; //Create a backing field
public string Prop2 {
    get { return prop2; }
    set { prop2 = EditString(value); }
}

あなたはgetでprop2を返しています、それはスタックオーバーフローを引き起こします(無限の再帰は悪いです)。

プロパティ(Prop2)をそれ自体に設定しているため、あなたは無限のループにいます。

エラーはの定義にあります prop2. 。取得方法とセットの両方のメソッドは、単純にコールバックします prop2 財産であるため、無限の再帰を誘発します。

public string prop2 { 
  get { return prop2; // <-- This just calls prop2 get again}
}

ここにバッキングフィールドを追加して、そのようなプロパティの価値を保存する必要があります

private string m_prop2;
public string prop2 { 
  get { return m_prop2; } 
  set { m_prop2 = EditString(value); } } 

例外がスローされたときに、コールスタックを見ましたか? Prop2のセッターへの呼び出しの無限のリストが表示されます。

あなたはそれ自体にプロパティに設定しています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top