Когда инициализируется мое свойство C #? - PullRequest
0 голосов
/ 03 августа 2009

Я немного озадачен тем, когда именно моя собственность инициализируется.

Предположим, у меня есть свойство, объявленное так:

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

Метод doSomething заполняет словарь сообщений и возвращает его.

У меня вопрос, когда этот код запускается? Если я помещаю точку останова в код doSomething, он не срабатывает, но свойство MessageLookup содержит данные (это единственное место, где они инициализируются) при просмотре в отладчике.

Этот код запускается при создании? отладчик запускает его автоматически при наведении курсора на имя переменной? Если так, то почему не достигается точка останова?

Ответы [ 3 ]

7 голосов
/ 03 августа 2009

Этот код запускается всякий раз, когда кто-либо ссылается на свойство, а не раньше.

Если вы используете отладчик, вы увидите его, потому что отладчик пытается автоматически извлечь значения свойств (чтобы вы могли видеть состояние объекта). Я не знаю, игнорирует ли отладчик точки останова, когда оценивает свойства для себя - это все объясняет.

Попробуйте запустить свой код , а не в отладчике, и заставить некоторый код получить доступ к вашей собственности:

var lookup = someObject.MessageLookup;

Сделайте doSomething() сбросить трассировку стека, и вы увидите, что происходит.

0 голосов
/ 04 августа 2009

Получатели свойств (и ToString() в этом отношении) предполагаются равными pure , что в основном означает, что его оценка не имеет побочных эффектов. Вы должны переписать код, чтобы придерживаться этого предположения, иначе вы столкнетесь с неприятными последствиями . Если необходимо использовать отложенную инициализацию во время доступа, используйте метод GetMessageLookup().

0 голосов
/ 03 августа 2009

Он запускается при первой оценке вашего имущества. Никаких фоновых событий не происходит.

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

...