Heim >Backend-Entwicklung >C++ >Warum überschreiben sich meine Listenelemente in C# gegenseitig?

Warum überschreiben sich meine Listenelemente in C# gegenseitig?

Barbara Streisand
Barbara StreisandOriginal
2025-01-19 20:11:09855Durchsuche

Why are My List Items Overwriting Each Other in C#?

C#-Listenobjektwert wird überschrieben: Referenzsemantikproblem

Warum überschreiben alle Elemente in der Liste die vorherigen Werte, wenn ein neuer Wert zur Liste hinzugefügt wird? Dieses rätselhafte Verhalten ist auf die zugrunde liegenden Datenstrukturen und Referenzsemantik in C# zurückzuführen.

Verstehen Sie die Semantik von Klassen und Strukturen

In C# sind Klassen Referenztypen, was bedeutet, dass Variablen des Klassentyps einen Verweis auf die tatsächliche Objektposition im Speicher speichern. Strukturen hingegen sind Werttypen und Variablen enthalten direkt die tatsächlichen Daten.

Im bereitgestellten Code-Snippet:

<code class="language-csharp">List<Tag> tags = new List<Tag>();
Tag _tag = new Tag();
string[] tagList = new[] { "Foo", "Bar" };

foreach (string t in tagList)
{
    _tag.tagName = t; // 设置所有属性
    tags.Add(_tag);  // 覆盖之前的数值
}</code>

Da _tag ein Referenztyp ist, fügt die tags.Add(_tag)-Operation der Liste eine Referenz auf dasselbe Objekt hinzu. Dadurch verweisen tatsächlich alle Elemente in der Liste auf dieselbe Instanz. Wenn Sie eine Instanz über _tag ändern, werden alle Elemente in der Liste geändert.

Beheben Sie das Problem, indem Sie eine neue Instanz erstellen

Um ein Überschreiben zu verhindern, sollte für jede Iteration der Schleife eine neue Tag-Instanz erstellt werden:

<code class="language-csharp">foreach (string t in tagList)
{
    Tag _tag = new Tag(); // 为每次迭代创建一个新实例

    _tag.tagName = t;
    tags.Add(_tag);
}</code>

Jetzt erstellt jede Iteration eine neue Tag Instanz und stellt so sicher, dass jedes Objekt in der Liste seinen eigenen eindeutigen Wert hat.

Zusätzlicher Hinweis: Strukturen und Klassen

Durch die Verwendung von Strukturen anstelle von Klassen werden Überschreibprobleme vermieden, da Strukturen Werttypen sind. Wenn eine Struktur einer neuen Variablen zugewiesen wird, erstellt sie eine völlig neue Instanz, die ihren eigenen Wertesatz enthält. Daher führt tags.Add(_tag) einen Kopiervorgang durch und hat keinen Einfluss auf zuvor hinzugefügte Elemente.

Zusammenfassend lässt sich sagen, dass das Verständnis der Referenzsemantik und des Unterschieds zwischen Klassen und Strukturen von entscheidender Bedeutung ist, um Überschreibungsprobleme in Objektlisten in C# zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum überschreiben sich meine Listenelemente in C# gegenseitig?. 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