Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

var lookup = someObject.MessageLookup;

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

Другие советы

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

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

Предполагается, что

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top