Pregunta

Estoy un poco confundido acerca de cuándo exactamente mi Propiedad se está inicializando.

Supongamos que tengo una propiedad declarada así:

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

El método doSomething llena el diccionario de mensajes y lo devuelve.

Mi pregunta es, ¿cuándo se ejecuta este código? Si coloco un punto de interrupción en el código doSomething, no se golpea, pero la propiedad MessageLookup contiene datos (este es el único lugar donde se inicializa) cuando lo veo en el depurador.

¿Se ejecuta este código en la construcción? ¿El depurador lo ejecuta automáticamente cuando paso el mouse sobre el nombre de la variable? Si es así, ¿por qué no se alcanza el punto de interrupción?

¿Fue útil?

Solución

Ese código se ejecuta cada vez que alguien hace referencia a la propiedad, y no antes.

Si usa el depurador, lo verá porque el depurador intenta obtener valores de propiedad automáticamente (para que pueda ver el estado del objeto). No sé si el depurador ignora los puntos de interrupción mientras evalúa las propiedades por sí mismo, eso explicaría todo.

Intente ejecutar su código no en un depurador y haga que algún código acceda a su propiedad:

var lookup = someObject.MessageLookup;

Haga que doSomething () descargue un seguimiento de la pila y verá lo que está sucediendo.

Otros consejos

Se ejecuta cuando su propiedad se evalúa por primera vez. No hay cosas de fondo pasando.

Supongo que no estás viendo esto porque usas Quickwatch para inspeccionar tu objeto. En ese punto, se ejecutará y se omitirá su punto de interrupción.

Se supone que los

captadores de propiedades (y ToString () para ese caso) son puro , lo que básicamente significa que evaluarlo no tiene efectos secundarios. Debería reescribir el código para cumplir con esa suposición o se enfrentará a consecuencias desagradables . Si debe utilizar la inicialización diferida en el momento del acceso, utilice un método GetMessageLookup () en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top