Heim >Backend-Entwicklung >C++ >Warum überschreibt das Hinzufügen mehrerer Objekte zu einer Liste vorherige Einträge?
Informationen zum Überschreiben von Listen beim Hinzufügen mehrerer Objekte
Das Hinzufügen mehrerer Objekte zu einer Liste kann zu unerwartetem Verhalten führen: Alle Listeneinträge haben möglicherweise denselben Wert wie das zuletzt hinzugefügte Objekt. Dies geschieht aufgrund eines gemeinsamen Verweises auf eine einzelne Objektinstanz.
Sehen wir uns ein Beispiel an:
<code class="language-csharp">public class Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); Tag tag = new Tag(); // This is the problem! string[] tagList = new[] { "Foo", "Bar" }; foreach (string t in tagList) { tag.TagName = t; tags.Add(tag); }</code>
Der Code erstellt ein Tag
-Objekt (tag
) außerhalb der Schleife. Die Schleife ändert dann wiederholt dieses gleiche Objekt und fügt es der Liste hinzu. Folglich verweisen alle Listeneinträge auf dasselbe Objekt und spiegeln nur die endgültige TagName
Zuweisung wider.
Die Lösung: Neue Instanzen innerhalb der Schleife erstellen
Um dies zu korrigieren, erstellen Sie für jede Iteration ein neues Tag
Objekt innerhalb der Schleife:
<code class="language-csharp">foreach (string t in tagList) { Tag tag = new Tag(); // Create a new instance each time tag.TagName = t; tags.Add(tag); }</code>
Dadurch wird sichergestellt, dass jeder Listeneintrag auf ein eindeutiges Tag
-Objekt mit seinem eigenen eindeutigen TagName
verweist.
Alternative: Strukturen verwenden
Klassen in C# sind Referenztypen. Strukturen hingegen sind Werttypen. Durch die Verwendung einer Struktur kann das Überschreibproblem vermieden werden, da beim Hinzufügen zur Liste eine Kopie der Struktur erstellt wird.
<code class="language-csharp">public struct Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); foreach (string t in tagList) { Tag tag = new Tag { TagName = t }; //Creates a new instance each time tags.Add(tag); }</code>
Dieser Ansatz bietet eine prägnante und effiziente Lösung, indem er das inhärente Copy-on-Assignment-Verhalten von Strukturen nutzt. Beachten Sie jedoch, dass Strukturen mit Bedacht und nur dann verwendet werden sollten, wenn sie für die Daten, die sie darstellen, angemessen sind.
Das obige ist der detaillierte Inhalt vonWarum überschreibt das Hinzufügen mehrerer Objekte zu einer Liste vorherige Einträge?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!