2016-05-11 10 views
3

Zum BeispielWie mache ich eine Klasse mit List <> Member unveränderlich?

class School 
{ 
    public List<Student> Students {get; private set;} 
} 

Hier School ist nicht unveränderlich, da die Getter Students ein veränderliches Sammlung ist. Wie macht man die Klasse unwandelbar?

+3

Sie könnten eine [unveränderliche Liste] aussetzen (https://msdn.microsoft.com/en-us/library/e78dcd75.aspx) statt. – poke

+2

Was möchten Sie einschränken? Initialisierung der Sammlung oder Elemente in der Sammlung hinzugefügt? – vendettamit

+1

Hängt genau davon ab, was Sie unveränderlich meinen. Möchten Sie verhindern, dass Daten, die in jedem Schüler eingeschlossen sind, ebenfalls geändert werden? –

Antwort

5

Sie könnten nur aussetzen an immutable list statt:

class School 
{ 
    private readonly List<Student> _students = new List<Student>(); 

    public ReadOnlyCollection<Student> Students 
    { 
     get { return _students.AsReadOnly(); } 
    } 
} 

Natürlich tun dies immer noch keine Auswirkungen auf die Student Objekte hat, so völlig unveränderlich sein, die Student Objekte unveränderlich sein müssten.

+1

Guter Punkt. Die tiefe Unveränderbarkeit ist mit ähnlichen Problemen wie das tiefe Kopieren konfrontiert. –

+0

@BradThomas Wie wird das tiefe Kopieren in C# implementiert? In C# gibt es keinen Kopierkonstruktor. – user1899020

+0

Sie können den gesamten Weg durch die Hierarchie serialisieren oder kopieren. Dies kann je nach Typ relativ einfach oder komplex sein. siehe http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-spezific –

3

Machen Sie einfach Ihr Backing-Feld zu einem privaten Feld und geben Sie dem Getter der öffentlichen Eigenschaft eine schreibgeschützte Version der Liste zurück.

class School 
{ 
    private List<Student> students; 

    public ReadOnlyCollection<Student> Students 
    { 
     get 
     { 
      return this.students.AsReadOnly() 
     } 

     private set; 
    } 
} 
+0

Ich persönlich würde @ Pokes Antwort bevorzugen, weil die Öffentlichkeit Eigenschaft spiegelt deutlich die Readonly-Sammlung wider. –

+0

@ C.Evenhuis Guter Punkt. Code-Snippet aktualisiert – James