Возвращение свойства дочернего элемента управления в геттере бесконечно рекурсивно? - PullRequest
1 голос
/ 23 мая 2009

Итак ... это меня поставило в тупик. Я использую VS 2008 (C #).

У меня есть некоторый код, который бесконечно рекурсивен, но я не могу объяснить почему (ну, у меня есть предположение). Вы можете воспроизвести проблему, выполнив это:

  1. Создайте новый класс Form или UserControl. Добавить дочерний элемент управления (кнопка, метка, что угодно) к этому.
  2. Открыть файл кода. Переопределите свойство Font и сделайте так, чтобы оно возвращало и устанавливало дочерний элемент свойство Font элемента управления, т. е.

    class MyForm
    {
        public override Font Font
        {
            get { return childControl.Font; }
            set { childControl.Font = value; }  // not actually needed to reproduce 
        }
    }
    

    Вам нужен только получатель, чтобы вернуть свойство дочернего элемента управления, чтобы воспроизвести проблему. После следующей сборки не открывайте конструктор для вашей формы или UserControl, произойдет сбой VS.

  3. Запустите вашу программу. Это потерпит крах из-за StackOverflow. Это происходит на

    this.Controls.Add( childControl );
    

    строка файла конструктора. Вызов Get () для свойства Font является рекурсивным.

Итак, кто-нибудь знает, почему возврат свойства дочернего элемента управления в переопределении вызывает переполнение стека при добавлении дочернего элемента в коллекцию Controls?

1 Ответ

4 голосов
/ 23 мая 2009

Это потому, что получение шрифта элемента управления включает в себя просмотр шрифта родителя, что в вашем случае подразумевает просмотр шрифта дочернего элемента, который включает в себя просмотр шрифта родителя, который включает ...

С MSDN :

Свойство Font является окружающим имущество. Окружающая собственность является свойство управления, которое, если не установлено, является извлекается из родительского элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...