Wenn eine Setter für eine Eigenschaft List Umsetzung (in C#) ist es eine schlechte Sache zu schreiben als:List-Eigenschaft Setter
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = new List<string>(value); }
}
Up:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = value; }
}
Sollte es nicht geschrieben werden Bis heute habe ich das erstere verwendet, aber ich habe kürzlich einen Code gefunden, der letzteres verwendet und es scheint, dass dies wahrscheinlich der richtige Weg ist, dies zu implementieren.
Verwendet nicht die erstere, da die TheList-Eigenschaft geändert wird, wenn Änderungen an der externen Liste vorgenommen werden, die ihr zugewiesen wird. Zum Beispiel:
List<string> list = new List<string>();
list.Add("Hello");
var c = new someClass();
c.TheList = list;
die ehemalige Verwendung wird nicht der folgende Code die Verkapselung von theList brechen:
list.Clear();
Jetzt c.TheList ist auch leer, was nicht sein kann, was wir wollten. Unter Verwendung des letzteren Ansatzes würde c.Liste jedoch nicht gelöscht werden.
Nein, zweite Lösung ist nicht korrekt. Verwenden Sie die erste Lösung und, wenn Sie eine Kopie anstelle einer Referenz festlegen möchten - schreiben Sie c.TheList = new List (Liste); –
vorrtex
Das hängt von Ihrer Besitz-Semantik ab. Einige Anrufer erwarten möglicherweise, dass sie in der Lage sind, die Liste zu setzen und sie "von außen" zu aktualisieren. Welchen Pfad Sie auch immer nehmen, dokumentieren Sie ihn entsprechend. –
Danke für die tollen Antworten. Ich bin froh, dass ich den zweiten Ansatz nicht verwendet habe, ohne zuerst zu prüfen. Es scheint, dass der Konsens darin besteht, in den meisten Fällen keinen Setter bereitzustellen oder ihn zumindest zu schützen. – mikesigs