Kann den Wert der Strukturelemente in generischen Auflistungen nicht ändern

8

Stellen Sie sich struct vor:

%Vor%

Und folgender Code:

%Vor%

Wenn ich den Wert von Property ändern will, gibt es den folgenden Fehler:

%Vor%

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?

    
saber 18.02.2013, 20:55
quelle

3 Antworten

13

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:

%Vor%

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.

Warum sind veränderliche Strukturen "böse"?

    
Chris Sinclair 18.02.2013, 20:59
quelle
4

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?

    
Hamlet Hakobyan 19.02.2013 13:04
quelle
0

Wiederholen Sie Ihre struct als solche:

%Vor%

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.

    
Jesse C. Slicer 18.02.2013 21:26
quelle