Question

Je ne sais pas exactement quand ma propriété est en cours d'initialisation.

Supposons que j'ai une propriété déclarée comme ceci:

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

La méthode doSomething remplit le dictionnaire de messages et le renvoie.

Ma question est la suivante: quand ce code est-il exécuté? Si je place un point d'arrêt dans le code doSomething, il n'est pas touché, mais la propriété MessageLookup contient des données (c'est le seul emplacement initialisé) lorsque je les affiche dans le débogueur.

Ce code est-il exécuté à la construction? le débogueur l'exécute-t-il automatiquement lorsque je survole le nom de la variable? Si tel est le cas, pourquoi le point d'arrêt n'est-il pas touché?

Était-ce utile?

La solution

Ce code est exécuté chaque fois que quelqu'un fait référence à la propriété et pas avant.

Si vous utilisez le débogueur, vous le verrez car il essaie d'extraire automatiquement les valeurs des propriétés (pour que vous puissiez voir l'état de l'objet). Je ne sais pas si le débogueur ignore les points d'arrêt lorsqu'il évalue les propriétés pour lui-même - cela expliquerait tout.

Essayez d'exécuter votre code pas dans un débogueur et faites en sorte que du code accède à votre propriété:

var lookup = someObject.MessageLookup;

Faites en sorte que doQuelque chose () vide une trace de pile et vous verrez ce qui se passe.

Autres conseils

Il est exécuté lors de la première évaluation de votre propriété. Aucun élément de fond ne se passe.

Je suppose que vous ne le voyez pas parce que vous utilisez Quickwatch pour inspecter votre objet. À ce stade, il sera exécuté et votre point d'arrêt sera ignoré.

Les getters de propriétés (et ToString () d'ailleurs) sont supposés être pur , ce qui signifie essentiellement qu’il n’ya aucun effet secondaire. Vous devez réécrire le code pour adhérer à cette hypothèse ou vous ferez face à conséquences désagréables . Si vous devez utiliser une initialisation différée au moment de l’accès, utilisez plutôt une méthode GetMessageLookup () .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top