Over Stack Overflow und das Internet Ich sehe, 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.Wie mache ich eine Struktur unveränderlich?
Angenommen, eine Struktur hat keine Referenztypen darin, wie mache ich eine Struktur eigentlich unveränderlich? Das heißt, wie verhindere ich die Mutation eines seiner primitiven Felder (vielleicht durch eine Kompilierungszeit/Laufzeitausnahme)?
Ich schrieb einen einfachen Test eine Struktur unveränderlich Versuch machen, aber nicht einmal mit der System.ComponentModel.ImmutableObjectAttribute
gearbeitet:
class Program
{
static void Main(string[] args)
{
ImmutableStruct immStruct1 = new ImmutableStruct();
Console.WriteLine(immStruct1); //Before mutation.
immStruct1.field1 = 1;
immStruct1.field2 = "Hello";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 1st mutation.
immStruct1.field1 = 2;
immStruct1.field2 = "World";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 2nd mutation.
Console.ReadKey();
}
}
[ImmutableObject(true)]
struct ImmutableStruct
{
public int field1;
public string field2;
public object field3;
public override string ToString()
{
string field3String = "null";
if (field3 != null)
{
field3String = field3.GetHashCode().ToString();
}
return String.Format("Field1: {0}, Field2: {1}, Field3: {2}", field1, field2, field3String);
}
}
Ein bisschen OT, aber gibt es einen bestimmten Grund brauchen Sie eine Struktur statt nur mit einer Klasse? Ich habe keinen Anwendungsfall gefunden, in dem eine Struktur in vielen Jahren der LOB-Programmierung einer Klasse vorzuziehen ist. – StingyJack
Felder als schreibgeschützt markieren? Haben Sie auch Folgendes gesehen: http://stackoverflow.com/questions/29974301/should-a-c-sharp-struct-have-only-read-only-properties – Pawel
Die Struktur im Hinterkopf ähnelt der Bitfeldstruktur von C++. Die Struktur wird instanziiert, und mein Wunsch ist, dass die Struktur niemals geändert wird - es gibt ein Versprechen, dass ich die Daten nicht versehentlich geändert habe. –