3
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エラーがスローされます。私は何が間違っているのですか?

4

7 に答える 7

9

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

プロパティセッターの行prop2 = ...は、プロパティセッターを呼び出します。プロパティセッターは、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出し、自分自身を再度呼び出します。 、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは自分自身を再び呼び出す、それは再び自分自身を呼び出します..。

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

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

例えば:

private string prop2; //Create a backing field
public string Prop2 {
    get { return prop2; }
    set { prop2 = EditString(value); }
}
于 2010-11-24T17:38:08.237 に答える
4

Prop2はProp2を設定/返します...Prop2を呼び出してProp2の値を取得/設定します。Prop2を呼び出します...これがどこに向かっているのかわかりますか?

これは、コンピューター/ランタイムが呼び出しスタックを格納するためのスペースを使い果たして死ぬまで起こり続けます。

于 2010-11-24T17:39:02.590 に答える
3

getでprop2を返すと、スタックオーバーフローが発生します(無限再帰は悪いです)。

于 2010-11-24T17:38:17.267 に答える
1

エラーはの定義にありprop2ます。getメソッドとsetメソッドはどちらも、プロパティを呼び出すだけな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); } } 
于 2010-11-24T17:41:30.763 に答える
1

プロパティ(prop2)をそれ自体に設定しているため、無限ループに陥っています。

于 2010-11-24T17:39:42.617 に答える
0

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

于 2010-11-24T17:40:38.143 に答える
0

プロパティをそれ自体に設定しています

于 2010-11-24T18:30:58.767 に答える