2016-11-23 4 views
0

Auf einem webforms .aspx Seite System, die Master-Seite ein paar Eigenschaften Auto initialisiert, als solcheWann initialisieren C# Auto-Eigenschaften?

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

Profilieren Laden der Seite hat, sehe ich, dass zwischen dem PreRender Ereignis, und die Initialisierung eines der Objekte Es eine große Lücke.

Wo kann ich nach der Verzögerung suchen? Was läuft zwischen den beiden?

Antwort

6

Das ist keine automatische Eigenschaft. Das ist ein ausdrucksstarkes Mitglied.

Ihre Implementierung von MyProp berechnet bool.Parse(Service.Settings["YorN"]);jedes Mal, wenn die Eigenschaft Getter genannt wird. Also in Ihrem Fall wird dieser Code ausgeführt, wenn MyProp aufgerufen wird, und es jeweils Zeit aufgerufen wird.

Wenn Sie eine Auto-Eigenschaft verwendet, die

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

Dann wäre wäre es ausgeführt werden, nachdem die Instanz erstellt wird, und kurz vor dem Konstruktor aufgerufen wird (wenn anderes Feld Initialisierungen ausgeführt werden). Beachten Sie, dass dieser Code nicht in einem Feldinitialisierer ausgeführt werden kann, sondern den impliziten Verweis (this). Wenn also Service eine Instanzvariable ist, wird dies nicht kompiliert.

+0

Ist es nicht _after_ der Konstruktor aufgerufen wird? – JNF

+0

@JNF: Es wäre, bevor der Konstruktor * body * zur gleichen Zeit wie andere Feldinitialisierer ausgeführt wird. –

+0

@JNF Nein, Feldinitialisierungen werden vor dem Konstruktor ausgeführt. Erstellen Sie eine Instanz dieser Klasse, um selbst zu sehen: 'public class Foo {int i = 5; Öffentliches Foo() {Console.WriteLine (i); }} 'Wenn das Feld zuerst initialisiert wird, wird '5' gedruckt, andernfalls '0'. – Servy

0

Sie nicht, Eigenschaften sind wie Methoden in diesem Fall, wenn sie Ausdruck Körper haben - ihre Inhalte ausgewertet werden, wenn Sie versuchen, von ihnen zu lesen.

Also jedes Mal, wenn etwas versucht, den Wert von MyProp zu lesen, wird dieser Ausdruck ausgeführt.

Was Sie wahrscheinlich tun möchten, ist dies als schreibgeschützte Eigenschaft und setzen Sie es während Ihrer Klassen Konstruktor.

1

Technisch ist das ein ausdrucksbasiertes Mitglied, das nur aufgerufen wird, wenn Sie versuchen, die Eigenschaft zu "bekommen". So heißt es , wenn es nach gefragt wird.

Es ist das Äquivalent von:

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