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
Susan SarandonOriginal
2025-01-19 20:18:17236Durchsuche

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>

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>

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!

Stellungnahme:
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