2017-03-20 2 views
0

Da ich nicht den Begriff kennen, der sich darauf bezieht, bin ich nicht sicher, was nach vorhandenen Kommentaren zu diesem suchen.C# -Ausdruck Körper mit {Get;} vs ohne

I eine Menge Zeit mit einem Expressionskörper kürzlich vergeudet ähnelt:

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 

Als ich versuchte, Werte zu setzen, wie beispielsweise:
SearchSomeModel.Property = 12345;

Es handelte wie alles gut war. Aber der tatsächliche Wert hat sich nie geändert. Wenn ich stattdessen ein {get;} wie in:

eingefügt wurde Es funktionierte richtig.

Das Komische ist, dass, wenn dies als normale get beginnt (mit einem get {return ..} dann ReSharper (?) Bietet es die erste Version zu konvertieren.

Wie auch immer, ich möchte verstehen, der Unterschied zwischen den beiden (nein, nicht auf einer CLR-Ebene), sondern nur zu a) weiß, wie man sich auf jeden in seinen richtigen Begriffen bezieht und b) warum einer arbeitet und der andere nur vorgibt zu arbeiten.

Danke!

+1

Einfache [TryRoslyn] (https://tryroslyn.azurewebsites.net/#b:master/f:r/K4Zwlgdg5gBAygTxAFwKYFsDcBYAUAB2ACMAbMAYxnJIEMQQYBhGAbzxg5kNIpgHsiAK1TlkMAJIBGGAF4AfDAioA7vyEjkACgCUOXJxjtO3MpQHDREgEysYUVMkwwAvrMUq1FrbrzOgA===), das zeigt den Unterschied ... – xanatos

+0

Wenn ich mich nicht irre, wertet der Ausdruck body den Wert immer wieder aus (dh er ruft den Konstruktoraufruf auf, den Sie jedes Mal geschrieben haben, wenn Sie den Wert von SearchSomeModel lesen), während Ihr zweites Beispiel nur eine Eigenschaft mit dem einen Wert initialisiert wird dann gespeichert und kann geändert werden. – MetaColon

+3

Die Suche nach dem genauen Titel Ihrer Frage führt zu (vielen) Seiten, die die Antwort auf Ihre Frage erklären, so dass Sie * einen geeigneten Suchbegriff für dieses Problem kennen. – Servy

Antwort

4

Die erste Zeile Code -

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 

bedeutet, dass es eine neue Instanz von ShowSomeViewModel jedes Mal erstellen, die Sie zu get es versuchen.
Es ist das Äquivalent von:

public SomeListViewModel SearchSomeModel { 
    get {return new ShowSomeViewModel{...};} 
} 

Auf der anderen Seite der

public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...}; 

bedeutet, dass Sie einen Standardwert festlegen.

+0

Danke! Das scheint jetzt ziemlich klar zu sein, dass Sie es erwähnen. Gibt es einen Ausdruck für beide oder nur für die verschiedenen Arten von Ausdruckskörpern? – JustMeToo

+1

Dies ist ein wichtiger Unterschied. Obwohl es keine harte Regel ist, ist es eine Erwartung, dass ich, wenn ich ein zweites Mal ohne Änderungen an dem Objekt "rufe", denselben Wert bekomme. Es ist eine "Eigentum Sache" (aka "Mutator" oder "Accessor"). –

+0

@JustMeToo Die erste, wie Sie erwähnt haben, ist eine Ausdruck Körper-Eigenschaft, und die zweite, die ich glaube, kann eine Getter nur Auto-Eigenschaft mit einem Initialisierer genannt werden - das ist eine ziemlich lange Frist, nicht wahr? –

1

Der Code

public SomeListViewModel SearchSomeModel {get;} = new ShowSomeViewModel{...}; 

wird auf das Äquivalent

private SomeListViewModel _searchSomeModel = new ShowSomeViewModel{...}; 
public SomeListViewModel SearchSomeModel 
{ 
    get 
    { 
     return _searchSomeModel; 
    } 
} 

die zum equivlant von

public SomeListViewModel SearchSomeModel => new ShowSomeViewModel{...}; 

wird setzten Code

public SomeListViewModel SearchSomeModel 
{ 
    get 
    { 
     return new ShowSomeViewModel{...}; 
    } 
} 
übersetzt

Wenn Sie das zweite Formular bei jedem Aufruf der Eigenschaft verwenden, erhalten Sie eine neue Instanz von ShowSomeViewModel. Bei Verwendung des ersten Formulars erhalten Sie bei jedem Aufruf dasselbe Objekt zurück.

Der Grund, warum das zweite Formular nicht funktionierte, war, dass Sie den Wert der alten Instanz aktualisierten, aber wenn Sie die Eigenschaft ein zweites Mal aufgerufen haben, um eine neue Instanz des Ansichtsmodells zu erhalten Änderungen.