A janela de inspeção da Heisenberg
Isso pode te incomodar muito se você estiver fazendo coisas sob demanda, como esta:
private MyClass _myObj;
public MyClass MyObj {
get {
if (_myObj == null)
_myObj = CreateMyObj(); // some other code to create my object
return _myObj;
}
}
Agora, digamos que você tenha algum código em outro lugar usando isso:
// blah
// blah
MyObj.DoStuff(); // Line 3
// blah
Agora você deseja depurar seu CreateMyObj()
método. Então você coloca um ponto de interrupção na Linha 3 acima, com a intenção de entrar no código. Apenas para uma boa medida, você também coloca um ponto de interrupção na linha acima _myObj = CreateMyObj();
, e até um ponto de interrupção dentroCreateMyObj()
si.
O código atinge seu ponto de interrupção na Linha 3. Você entra no código. Você espera inserir o código condicional, porque _myObj
obviamente é nulo, certo? Uh ... então ... por que pulou a condição e foi direto parareturn _myObj
?! Você passa o mouse sobre _myObj ... e, de fato, ele tem um valor! Como isso aconteceu?!
A resposta é que seu IDE fez com que ele obtivesse um valor, porque você tem uma janela de observação aberta - especialmente a janela de observação "Autos", que exibe os valores de todas as variáveis / propriedades relevantes para a linha de execução atual ou anterior. Quando você atingiu seu ponto de interrupção na Linha 3, a janela de inspeção decidiu que você estaria interessado em saber o valor de MyObj
- portanto, nos bastidores, ignorando qualquer um de seus pontos de interrupção , ele calculou o valor MyObj
para você - incluindo a chamada para CreateMyObj()
isso define o valor de _myObj!
É por isso que eu chamo isso de Janela de inspeção Heisenberg - você não pode observar o valor sem afetá-lo ... :)
PEGUEI VOCÊS!
Editar - Eu sinto que o comentário de @ ChristianHayter merece inclusão na resposta principal, porque parece uma solução alternativa eficaz para esse problema. Então, sempre que você tiver uma propriedade preguiçosa ...
Decore sua propriedade com [DebuggerBrowsable (DebuggerBrowsableState.Never)] ou [DebuggerDisplay ("<loading on demand>")]. - Christian Hayter