プロパティC#のセット関数でネストされたクラスでstackoverflowexceptionエラーを取得しています
-
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のセッターへの呼び出しの無限のリストが表示されます。
あなたはそれ自体にプロパティに設定しています