Heim > Backend-Entwicklung > C++ > Warum überschreibt das Hinzufügen mehrerer Objekte zu einer Liste vorherige Einträge?

Warum überschreibt das Hinzufügen mehrerer Objekte zu einer Liste vorherige Einträge?

Susan Sarandon
Freigeben: 2025-01-19 20:18:17
Original
277 Leute haben es durchsucht

Why Does Adding Multiple Objects to a List Overwrite Previous Entries?

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>
Nach dem Login kopieren

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 TagObjekt 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage