Stellen Sie sich struct
vor:
Und folgender Code:
%Vor% Wenn ich den Wert von Property
ändern will, gibt es den folgenden Fehler:
Während ich versuchte, es in einem Array wie Person[]
zu ändern, funktionierte es ohne Fehler. Gibt es ein Problem mit meinem Code bei der Verwendung mit generischen Sammlungen?
Wenn Sie den struct
über den Indexer List[]
zurückgeben, wird eine Kopie des Eintrags zurückgegeben. Wenn du also FirstName
zugewiesen hast, würde es einfach weggeworfen werden. Daher der Compilerfehler.
Schreiben Sie entweder Person
als Referenztyp class
neu oder führen Sie eine vollständige Neuzuordnung durch:
Im Allgemeinen verursachen veränderbare Strukturen Probleme wie diese, die Kopfschmerzen auf der Straße verursachen können. Wenn Sie keinen wirklich guten Grund haben, sie zu verwenden, sollten Sie in Erwägung ziehen, den Typ Person
zu ändern.
Offensichtlich ist ein Teil der Frage noch unbeantwortet. Was ist der Unterschied zwischen List<Person>
und Person[]
? In Bezug auf das Aufrufen von Element für Index gibt der List
-Rufindexer (Methode) die Kopie der Werttypinstanz zurück, im entgegengesetzten Array vom Index gibt es keine Kopie zurück, sondern den verwalteten Zeiger auf das Element am Index (verwendeter spezieller IL-Befehl ldelema ).
Natürlich sind veränderbare Werttypen böse, wie in anderen Antworten erwähnt. Schau dir das einfache Beispiel an.
%Vor%Überrascht?
Wiederholen Sie Ihre struct
als solche:
Und folgender Code als:
%Vor% Dies liegt an der Kopiesemantik von struct
. Mach es unveränderlich und arbeite innerhalb dieser Einschränkungen und das Problem verschwindet.
Tags und Links .net c# struct generic-list generic-collections