Per alcune classi, idealmente, mi piacerebbe creare istanze con nome speciale, simili a "null". Per quanto ne so, questo non è possibile, così, invece, ho creare istanze statici della classe, con un costruttore statico, simile a questo:C# Come creare istanze speciali di una classe?
public class Person
{
public static Person Waldo; // a special well-known instance of Person
public string name;
static Person() // static constructor
{
Waldo = new Person("Waldo");
}
public Person(string name)
{
this.name = name;
}
}
Come si può vedere, Person.Waldo è un caso speciale di la classe Person, che ho creato perché nel mio programma, ci sono molte altre classi che potrebbero voler fare riferimento a questa speciale istanza ben nota.
Lo svantaggio di implementare questo modo è che non conosco alcun modo per rendere immutabili tutte le proprietà di Person.Waldo, mentre tutte le proprietà di un'istanza di Persona "normale" dovrebbero essere modificabili. Ogni volta che accidentalmente ho un oggetto Person che si riferisce a Waldo e incautamente non controllo per vedere se si riferisce a Waldo, poi accidentalmente clobber le proprietà di Waldo.
C'è un modo migliore, o anche qualche altro modo alternativo, per definire le istanze ben note di una classe?
L'unica soluzione che conosco adesso è quella di implementare gli accessi di set & e selezionare "if (this == Waldo) per lanciare nuovi ..." su ogni set. Mentre funziona, suppongo che C# possa fare un lavoro migliore di me per implementarlo. Se solo riesco a trovare un modo C# per rendere tutte le proprietà di Waldo in sola lettura (tranne durante il costruttore statico.)
Non potresti semplicemente usare l'accessor nella tua classe Waldo e non usare il mutatore? – Brian
Non una risposta diretta alla tua domanda, ma una possibile direzione: http://msdn.microsoft.com/en-us/library/ms750509.aspx e http://stackoverflow.com/questions/263585/immutable-object- pattern-in-c-sharp-what-do-think- – hatchet
Si potrebbe definire un'interfaccia 'IPerson' e rendere' Waldo' una classe che implementa 'IPerson', anche' Person' la implementa.Quindi è necessario rendere 'Waldo' immutabile, dare un'occhiata qui per ulteriori informazioni su come rendere una classe immutabile: http://stackoverflow.com/questions/352471/how-do-i-create-an-immutable-class –