Pergunta

Estou um pouco confuso sobre quando exatamente minha propriedade está sendo inicializada.

Suponha que eu tenha uma propriedade declarada assim:

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

O método do dosomething preenche o dicionário de mensagens e o devolve.

Minha pergunta é: quando esse código é executado? Se eu colocar um ponto de interrupção no código do dosomething, ele não é atingido, mas a propriedade Messagelookup está mantendo dados (este é o único local em que é inicializado) quando o vejo no depurador.

Este código é executado na construção? O depurador é executado automaticamente quando eu passar o mouse sobre o nome da variável? Se sim, por que o ponto de interrupção não foi atingido?

Foi útil?

Solução

Esse código é executado sempre que alguém se refere à propriedade, e não antes.

Se você usar o depurador, verá porque o depurador tenta buscar valores de propriedades automaticamente (para que você possa ver o estado do objeto). Não sei se o depurador ignora pontos de interrupção enquanto avalia propriedades por si mesma - isso explicaria tudo.

Tente executar seu código não em um depurador e faça com que algum código acesse sua propriedade:

var lookup = someObject.MessageLookup;

Faço doSomething() Despeje um rastreamento de pilha e você verá o que está acontecendo.

Outras dicas

É executado quando sua propriedade é avaliada pela primeira vez. Nenhuma coisa de fundo acontecendo.

Acho que você não está vendo isso porque usa o Quickwatch para inspecionar seu objeto. Nesse ponto, ele será executado e seu ponto de interrupção será ignorado.

Propriedade Getters (e ToString() para esse assunto) supõe -se que seja puro, o que basicamente significa avaliá -lo não tem efeitos colaterais. Você deve reescrever o código para aderir a essa suposição ou enfrentará consequências desagradáveis. Se deve usar a inicialização preguiçosa no tempo de acesso, use um GetMessageLookup() método em vez disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top