Tutto su Stack Overflow e Internet Vedo che è un buon principio di progettazione mantenere le strutture immutabili. Sfortunatamente, non vedo mai alcuna implementazione che possa effettivamente rendere queste strutture veramente immutabili.Come si rende una struttura immutabile?
Supponendo che una struttura non abbia alcun tipo di riferimento al suo interno, come posso effettivamente rendere una struttura immutabile? Cioè, come posso impedire la mutazione di uno qualsiasi dei suoi campi primitivi (forse da un'eccezione in fase di compilazione/runtime)?
ho scritto un semplice test di tentare fare una struct immutabile, ma nemmeno utilizzando il System.ComponentModel.ImmutableObjectAttribute
lavorato:
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);
}
}
Un po 'OT, ma c'è qualche ragione specifica per cui hai bisogno di una struttura invece di usare solo una classe? Non ho trovato un caso di utilizzo in cui una struttura è preferibile rispetto a una classe in molti anni di programmazione LOB. – StingyJack
Contrassegna i campi come readonly? Inoltre, hai visto questo: http://stackoverflow.com/questions/29974301/should-a-c-sharp-struct-have-only-read-only-properties – Pawel
La struttura in mente è simile alle strutture bitfield del C++. La struttura è istanziata, e il mio desiderio è che la struttura non cambierà mai - c'è una promessa che non ho modificato i dati per sbaglio. –