2015-10-20 5 views
6

Was zur Initialisierung der Eigenschaften in C# die Differenz zwischen den folgenden Ausdrücken 6:Unterschied zwischen (auto) Eigenschaften Initialisierung Syntax in C# 6

1. Auto-Liegenschaften von Konstruktor initialisiert

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 

2: Eigenschaft von einem Trägerfeld initialisiert

public class Context2 
{ 
    private readonly List<string> items; 

    public Context2() 
    { 
     this.items = new List<string>(); 
    } 

    public List<string> Items 
    { 
     get 
     { 
      return this.items; 
     } 
    } 
} 

3: Auto-Property neue Syntax in C# 6

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

4: Auto-Property neue Syntax in C# 6

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

Antwort

13

Listing 3 äquivalent C# 6 von 2 der Auflistung, wo das Hintergrundfeld ist unter der Haube vorgesehen.

Listing 4:

public List<string> Items => new List<string>(); 

entspricht:

public List<string> Items { get { return new List<string>(); } } 

die, wie Sie sich vorstellen können gibt eine neue leere Liste jedes Mal, wenn Sie die Eigenschaft zugreifen.

Der Unterschied zwischen Listings 2/3 und 4 wird in this Q&A mit einem Beispiel näher untersucht.

Listing 1 ist nur eine Auto-Eigenschaft mit einem Getter und einem privaten Setter. Es ist keine schreibgeschützte Eigenschaft, die Sie überall dort festlegen können, wo Sie auf private Member des Typs zugreifen können. Eine schreibgeschützte Eigenschaft (dh eine Getter-only-Eigenschaft) kann nur entweder in einem Konstruktor oder in der Eigenschaftsdeklaration wie ein schreibgeschütztes Feld initialisiert werden.

+0

So Nummer 4 ist wie eine Konstante, aber mit einer Referenztyp !? –

+7

Wenn Sie mit "Konstante" meinen, dass "ständig eine neue Instanz dieses Werts zurückgegeben wird" (à la https://xkcd.com/221), dann ... äh, denke ich. Aber das ist nicht was "konstant" bedeutet. Es gibt einen Grund, warum Referenztypen * keine Konstanten sein können. – BoltClock

+0

Sind Nummer 1 und 2 ähnlich? –

3

Auto-Eigenschaft ist eine Kurzbezeichnung für automatisch implementierte Eigenschaft, wo der Entwickler muss nicht explizit das dahinter liegende Feld erklären, und der Compiler setzt man hinter den Kulissen auf.

1. Auto-Liegenschaften mit eigenem Setter

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 

Auto-Eigenschaften können unterschiedliche Erreichbarkeiten für Setter und Getter haben durch eine restriktivere Zugänglichkeit für die Accessor Angabe, für welche die Zugänglichkeit von der Zugänglichkeit der Eigenschaft unterscheidet.

Andere Beispiele sind:

public string Prop1 { get; private set; } 
public string Prop2 { get; protected set; } 
public string Prop3 { get; internal set; } 
public string Prop4 { protected internal get; set; } 

Diese Accessoren mit unterschiedlicher Zugänglichkeit können überall zugegriffen werden die, dass die Zugänglichkeit bestimmt, nicht nur aus dem Konstruktor.

2.Schreibgeschützte Eigenschaft mit Hintergrundfeld

öffentliche Klasse Context2 { private readonly Listenelemente;

public Context2() 
{ 
    this.items = new List<string>(); 
} 

public List<string> Items 
{ 
    get { return this.items; } 
} 

} Vor C# 6, der einzige Weg, um den Wert einer Nur-Lese-Eigenschaft zu setzen war ausdrücklich das dahinter liegendes Feld zu erklären und es direkt eingestellt.

Da das Feld den readonly Accessor hat, kann es nur während der Konstruktion des Objekts festgelegt werden.

3. Read-Only Auto-Liegenschaften

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

Beginnend mit C# 6, §2 kann vom Compiler behandelt werden, indem ein Trägerfeld haben erzeugt wie für Lese-Schreib-Auto-Eigenschaften, aber In diesem Fall ist das Hintergrundfeld schreibgeschützt und kann nur während der Konstruktion des Objekts festgelegt werden.

4. Nur-Lese-Auto-Property mit Ausdruck bodied Getter

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

Wenn Eigenschaften haben einen Wert, der jedes Mal, es ist erhalten, C# 6 erlaubt zu erklären, um den Körper des Getter ändert sich mit eine Lambda-ähnliche Syntax.

Der obige Code ist dies äquivalent:

public class Context4 
{ 
    public List<string> Items 
    { 
     get { return new List<string>(); } 
    } 
} 
Verwandte Themen