Wie mache ich eine Struktur unveränderlich?

9

Überall im Stack Overflow und im Internet sehe ich, dass es ein gutes Designprinzip ist, um Strukturen unveränderbar zu halten. Leider sehe ich nie eine Implementierung, die diese Strukturen wirklich unveränderlich macht.

Unter der Annahme, dass eine Struktur keine Referenztypen enthält, wie mache ich eine Struktur eigentlich unveränderlich? Das heißt, wie verhindere ich die Mutation eines seiner primitiven Felder (möglicherweise durch eine Kompilierungszeit / Laufzeitausnahme)?

Ich habe einen einfachen Test geschrieben, der versucht, eine Struktur unveränderlich zu machen, aber nicht einmal die System.ComponentModel.ImmutableObjectAttribute funktioniert:

%Vor%     
Nick Miller 21.04.2016, 20:50
quelle

2 Antworten

12

Machen Sie die Felder private readonly und übergeben Sie die Initialwerte im Konstruktor

%Vor%

Beginnend mit C # 6.0 (Visual Studio 2015) Sie können nur Getter-Eigenschaften verwenden

%Vor%

Beachten Sie, dass schreibgeschützte Felder und Getter-only-Eigenschaften entweder im Konstruktor oder in Klassen auch mit Feld- oder Eigenschaftsinitialisierungen public int Field1 { get; } = 7; initialisiert werden können.

Es ist nicht garantiert, dass der Konstruktor in einer Struktur ausgeführt wird. Z.B. Wenn Sie ein Array von Strukturen haben, müssen Sie die Initialisierer dann für jedes Array-Element explizit aufrufen. Bei Arrays von Referenztypen werden alle Elemente zuerst mit null initialisiert, was es offensichtlich macht, dass Sie new für jedes Element aufrufen müssen. Aber es ist leicht, es für Werttypen wie Strukturen zu vergessen.

%Vor%     
Olivier Jacot-Descombes 21.04.2016, 21:07
quelle
3

Halten Sie Ihre unveränderlichen Daten privat:

%Vor%

Oder weniger überladen:

%Vor%     
Quality Catalyst 21.04.2016 21:05
quelle

Tags und Links