Heim >Backend-Entwicklung >C++ >Warum führt das Hinzufügen von Elementen zu einer Liste zum Überschreiben?
Das Hinzufügen von Elementen zu einem List<T>
in C# kann manchmal zu unerwarteten Ergebnissen führen: Alle Elemente sind am Ende identisch mit dem zuletzt hinzugefügten. In diesem Artikel wird erläutert, warum und wie das Problem behoben werden kann.
Lassen Sie uns ein vereinfachtes Szenario untersuchen:
<code class="language-csharp">List<Tag> tags = new List<Tag>(); Tag _tag = new Tag(); // Problem: Single instance reused string[] tagList = new[] { "Foo", "Bar" }; foreach (string t in tagList) { _tag.tagName = t; tags.Add(_tag); }</code>
Das Problem entsteht durch die Wiederverwendung derselben _tag
Instanz innerhalb der Schleife. Bei jeder Iteration wird dasselbe Objekt geändert, was dazu führt, dass alle Listeneinträge den Endwert behalten.
Die Lösung: Neue Instanzen für jedes Element
Der richtige Ansatz besteht darin, für jede Schleifeniteration ein neues _tag
-Objekt zu erstellen:
<code class="language-csharp">foreach (string t in tagList) { Tag _tag = new Tag(); // New instance each time _tag.tagName = t; tags.Add(_tag); }</code>
Dadurch wird sichergestellt, dass jedes Listenelement ein eindeutiges Objekt ist und eindeutige Werte erhalten bleiben.
Bonus: Das Verhalten von Strukturen
Interessanterweise würde der ursprüngliche Code korrekt funktionieren, wenn Tag
eine Struktur anstelle einer Klasse wäre. Dieser Unterschied ergibt sich aus der Art und Weise, wie Klassen und Strukturen mit der Speicherzuweisung umgehen.
Klassen sind Referenztypen; Die Übergabe einer Klasse als Wert kopiert nur die Referenz, nicht das Objekt selbst. Durch Ändern des Parameters innerhalb einer Methode wird das ursprüngliche Objekt geändert. Strukturen hingegen sind Werttypen. Durch die Übergabe einer Struktur als Wert wird eine Kopie erstellt. Daher fügt das Hinzufügen von _tag
(einer Struktur) zur Liste eine Kopie hinzu und verhindert so Überschreibungen.
Das obige ist der detaillierte Inhalt vonWarum führt das Hinzufügen von Elementen zu einer Liste zum Überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!