2016-11-23 10 views
0

Sur un système page webforms .aspx, la page principale a quelques propriétés auto initialisé, en tant que telleQuand l'initialisation des propriétés automatiques C# est-elle effectuée?

public bool MyProp => bool.Parse(Service.Settings["YorN"]); 

charge page Profilage, je vois que entre l'événement PreRender et l'initialisation de l'une des propriétés il y a un grand écart.

Où puis-je chercher pour déterminer le délai? Qu'est-ce qui court entre les deux?

Répondre

6

Ce n'est pas une propriété auto. C'est un membre d'expression corporelle.

Votre implémentation de MyProp calcule bool.Parse(Service.Settings["YorN"]);chaque fois que le getter de la propriété est appelée. Donc, dans votre cas, ce code est exécuté chaque fois que MyProp est appelé, et il est exécuté chaque temps il s'appelle.

Si vous avez utilisé une propriété automatique, ce qui serait

public bool MyProp {get;} = bool.Parse(Service.Settings["YorN"]); 

Ensuite, il serait exécuté après l'instance est créée, et juste avant que le constructeur est appelé (quand exécuter d'autres initialiseurs sur le terrain). Notez que, comme ce code s'exécute dans un initialiseur de champ, il ne peut pas utiliser la référence implicite (this) si Service est une variable d'instance, cela ne compilera pas.

+0

est-il pas _after_ le constructeur est appelé? – JNF

+0

@JNF: Ce sera avant que le constructeur * body * ne s'exécute, en même temps que les autres initialiseurs de champ. –

+0

@JNF Non, les initialiseurs de champ sont exécutés avant le constructeur. Créez une instance de cette classe pour voir par vous-même: 'public class Foo {int i = 5; Foo public() {Console.WriteLine (i); }} 'Si le champ est initialisé en premier, il affichera' 5', sinon il affichera '0'. – Servy

0

Ce n'est pas le cas, les propriétés sont comme les méthodes dans ce cas lorsqu'elles ont des corps d'expression - leur contenu est évalué lorsque vous essayez de les lire.

Ainsi, chaque fois que quelque chose essaie de lire la valeur de MyProp, il exécute cette expression.

Ce que vous voulez probablement faire est de le faire en tant que propriété en lecture seule et le définir au cours de votre constructeur de classes.

1

Techniquement, c'est un membre à corps d'expression, qui n'est appelé que lorsque vous essayez d'obtenir la propriété. Donc, il est appelé chaque fois qu'il est demandé.

Il est l'équivalent de:

public bool MyProp 
{ 
    get 
    { 
     return bool.Parse(Service.Settings["YorN"]); 
    } 
}