Когда инициализируется мое свойство C#?

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

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

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

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

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

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


person Erix    schedule 03.08.2009    source источник
comment
Не могли бы вы немного опубликовать содержимое метода doSomething?   -  person Zyphrax    schedule 03.08.2009
comment
Поставьте точку останова на return messages ?? doSomething() без запуска вашего проекта, а затем запустите его.   -  person Joel B Fant    schedule 03.08.2009


Ответы (3)


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

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

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

var lookup = someObject.MessageLookup;

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

person Jon Skeet    schedule 03.08.2009
comment
Просто чтобы убедиться, что я понял это... Отладчик не столкнется с точками останова в doSomething, если он выполняет автоматическую выборку? - person Erix; 04.08.2009
comment
Отладчик игнорирует все, включая работоспособность, во время функциональной оценки. blogs.msdn.com/ jmstall/архив/2007/03/13/ - person Sam Harwell; 04.08.2009
comment
@Me: я люблю func eval. Я просто удостоверяюсь, что мои чистые методы (включая те, которые отладчик считает чистыми) ведут себя правильно, и это никогда не проблема. - person Sam Harwell; 04.08.2009
comment
В зависимости от отладчика он может обойти некоторые из этих проблем, используя такие вещи, как DebuggerHidden и другие подобные атрибуты из пространства имен System.Diagnostics (т. е. отладчик будет игнорировать и не оценивать эти свойства автоматически), что позволит ему по-прежнему использовать отладчик и входить в свой код. без необходимости выполнять трассировку стека. - person Erich Mirabal; 04.08.2009

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

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

person Thorarin    schedule 03.08.2009

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

person Sam Harwell    schedule 03.08.2009