Domanda

Sono un po 'confuso riguardo all'esatta inizializzazione della mia proprietà.

Supponiamo di avere una proprietà dichiarata in questo modo:

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

Il metodo doSomething popola il messaggio Dizionario e lo restituisce.

La mia domanda è: quando viene eseguito questo codice? Se inserisco un punto di interruzione nel codice doSomething, non viene raggiunto, ma la proprietà MessageLookup contiene i dati (questo è l'unico posto in cui è inizializzato) quando li visualizzo nel debugger.

Questo codice viene eseguito in fase di costruzione? il debugger lo esegue automaticamente quando passo con il mouse sul nome della variabile? In tal caso, perché non viene colpito il punto di interruzione?

È stato utile?

Soluzione

Questo codice viene eseguito ogni volta che qualcuno fa riferimento alla proprietà e non prima.

Se usi il debugger, lo vedrai perché il debugger tenta di recuperare automaticamente i valori delle proprietà (in modo da poter vedere lo stato dell'oggetto). Non so se il debugger ignori i punti di interruzione mentre sta valutando le proprietà da solo - questo spiegherebbe tutto.

Prova a eseguire il codice non in un debugger e fai in modo che un codice acceda alla tua proprietà:

var lookup = someObject.MessageLookup;

Crea doSomething () scaricando una traccia dello stack e vedrai cosa sta succedendo.

Altri suggerimenti

Viene eseguito alla prima valutazione della proprietà. Non ci sono cose in background.

Suppongo che non lo vedi perché usi Quickwatch per ispezionare il tuo oggetto. A quel punto verrà eseguito e il tuo punto di interruzione verrà ignorato.

Si presume che

Getter di proprietà (e ToString () ) siano pure , il che significa sostanzialmente che la valutazione non ha effetti collaterali. Dovresti riscrivere il codice per aderire a tale presupposto o dovrai affrontare brutte conseguenze . Se è necessario utilizzare l'inizializzazione lenta al momento dell'accesso, utilizzare invece un metodo GetMessageLookup () .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top