Я получаю ошибку StackOverflowException в моем вложенном классе на функцию set свойства C # - PullRequest
3 голосов
/ 24 ноября 2010
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.что я делаю не так?

Ответы [ 7 ]

9 голосов
/ 24 ноября 2010

Ваше свойство настраивается само по себе.

Строка prop2 = ... в установщике свойств вызывает установщик свойств, который снова вызывает себя, снова вызывает себя, снова вызывает себя, снова вызывает себя, чтоснова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, что снова вызывает себя, чтоснова вызывает себя, снова вызывает себя, снова вызывает себя, снова вызывает себя, снова вызывает себя ...

Получатель делает то же самое, за исключением того, что вы никогда не вызываете его.

Вам необходимо создать вспомогательное поле для свойства, которое нужно получить и установить.

Например:

private string prop2; //Create a backing field
public string Prop2 {
    get { return prop2; }
    set { prop2 = EditString(value); }
}
4 голосов
/ 24 ноября 2010

Prop2 устанавливает / возвращает Prop2 ... который вызывает Prop2 для получения / установки значения Prop2, который вызывает Prop2 ... смотрите, куда это идет?

Это происходит до тех пор, пока компьютер / среда выполнения не запуститсянедостаточно места для хранения стека вызовов и он умирает.

3 голосов
/ 24 ноября 2010

Вы возвращаете prop2 в get, что вызывает переполнение стека (бесконечная рекурсия плоха).

1 голос
/ 24 ноября 2010

Ошибка в определении 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); } } 
1 голос
/ 24 ноября 2010

Вы находитесь в бесконечном цикле, потому что вы устанавливаете свойство (prop2) для себя.

0 голосов
/ 24 ноября 2010

Вы устанавливаете свойство для себя

0 голосов
/ 24 ноября 2010

Вы смотрели в стек вызовов, когда выдается исключение? Вы должны увидеть бесконечный список обращений к сеттеру для prop2.

...