C # 6 auto-properties - einmal oder jedes Mal gelesen?

7

Ich folge beim Festlegen bestimmter Eigenschaften einem Muster, wobei ich überprüfe, ob das entsprechende Feld leer ist, und gebe das Feld zurück, falls nicht, und setze es gegebenenfalls. Ich benutze das häufig zum Auslesen von Konfigurationseinstellungen, so dass die Einstellung z. B. nur langsam gelesen wird und nur einmal gelesen wird. Hier ist ein Beispiel:

%Vor%

Ich habe begonnen, C # 6 autoproperty Initialisierung zu verwenden, da es wirklich aufräumt und meinen Code prägnanter macht. Ich würde gerne so etwas machen:

%Vor%

Aber ich bin nicht sicher, wie der Compiler es in diesem Fall interpretiert. Hat dies die gleiche Wirkung wie mein erster Code-Block, indem ich das (automatisch implementierte) Feld einmal setze und danach aus dem Feld lese? Oder ruft dies den CloudConfigurationManager jedes mal auf, wenn ich DatabaseId ?

bekomme     
Ivan 17.08.2015, 13:43
quelle

4 Antworten

7

Was Sie zeigen:

%Vor%

Ist ein "Auto-Property Initializer", Stichwort "Initializer", von MSDN Blogs: C #: Die neue und verbesserte C # 6.0 :

  

Der Auto-Property-Initialisierer erlaubt die Zuweisung von Eigenschaften direkt innerhalb ihrer Deklaration. Bei schreibgeschützten Eigenschaften werden alle erforderlichen Zeremonien durchgeführt, um sicherzustellen, dass die Eigenschaft unveränderlich ist.

Initialisierungen werden einmal pro Instanz ausgeführt (oder einmal pro Typ für statische Elemente). Siehe C # -Sprachspezifikation, 10.4.5 Variable Initialisierer :

  

Beispielsweise entsprechen Felder, Variableninitialisierungen Zuweisungsanweisungen, die ausgeführt werden, wenn eine Instanz der Klasse erstellt wird.

Also kompiliert der Code zu so etwas:

%Vor%

Für statische Variablen sieht diese Art gleich aus:

%Vor%

Kompiliert zu mehr oder weniger:

%Vor%

Obwohl nicht vollständig, wenn der Typ keinen statischen Konstruktor hat, werden "statische Feldinitialisierer zu einer implementierungsabhängigen Zeit vor der ersten Verwendung eines statischen Feldes dieser Klasse ausgeführt".

    
CodeCaster 17.08.2015, 13:51
quelle
8

C # 6.0 readonly auto -Eigenschaft wird ein Feld erstellen und den Initialisierer nur einmal aufrufen.

Das ist jedoch nicht das, was Sie dort haben. In Ihrem Code wird CloudConfigurationManager.GetSetting nur aufgerufen, wenn jemand die DatabaseId Eigenschaft liest, aber mit "readonly auto property" wird CloudConfigurationManager.GetSetting zum Zeitpunkt der Klasseninitialisierung selbst aufgerufen.

Dieser Unterschied kann / darf nicht von Bedeutung sein. Es kommt darauf an. Wenn der Anruf teuer ist, können Sie Lazy<T> verwenden, was ungefähr dem entspricht, was Sie haben.

    
Sriram Sakthivel 17.08.2015 13:50
quelle
2

Es wird den Wert nur einmal und danach nur lesen.

Allerdings gibt es einen kleinen Unterschied in dem Sinne, dass Sie jetzt kein databaseId -Feld mehr haben. In Ihrem ersten Beispiel suchen Sie im Grunde nach id == null || id == "" , um den Datenbankstring zu setzen. Das bedeutet, wenn Sie eine neue Instanz mit databaseId auf einen leeren String setzen, wird das erste Beispiel immer noch die ID aus den Einstellungen erhalten.

Das zweite Beispiel wird jedoch die leere Zeichenfolge als gültigen Wert sehen und dabei bleiben.

Erster Code:

%Vor%

Zweiter Code:

%Vor%     
Jeroen Vannevel 17.08.2015 13:47
quelle
1

Eine Auto-Eigenschaft hat automatisch ein Hintergrundfeld. In diesem Fall ist dieses Feld nur vom Konstruktor oder vom Initiator der automatischen Eigenschaft zuweisbar. Dein neuer Code ist besser als der erste. Es wird nur ein Aufruf an CloudConfigurationManager.GetSetting("database"); erfolgen. Im ersten Beispiel müssen Sie jedes Mal eine Überprüfung durchführen, wenn Ihre Eigenschaft get aufgerufen wird.

    
Philippe Paré 17.08.2015 13:47
quelle

Tags und Links