Quando minha propriedade C# é inicializada?
-
11-07-2019 - |
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?
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.