Für einige Klassen, im Idealfall, möchte ich spezielle benannte Instanzen, ähnlich wie "null" erstellen. Soweit ich weiß, das ist nicht möglich, so stattdessen ich schaffen statische Instanzen der Klasse, mit einem statischen Konstruktor, ähnlich wie diese:C# Wie erstelle ich spezielle Instanzen einer Klasse?
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;
}
}
Wie Sie sehen können, ist Person.Waldo eine spezielle Instanz Die Klasse Person, die ich erstellt habe, weil es in meinem Programm viele andere Klassen gibt, die sich auf diese spezielle, bekannte Instanz beziehen könnten.
Der Nachteil der Implementierung dieser Methode ist, dass ich keine Möglichkeit kenne, alle Eigenschaften von Person.Waldo unveränderlich zu machen, während alle Eigenschaften einer "normalen" Person-Instanz änderbar sein sollten. Immer wenn ich versehentlich ein Person-Objekt habe, das sich auf Waldo bezieht, und ich achtlos nachschaue, ob es sich auf Waldo bezieht, dann klopfe ich aus Versehen an Waldos Grundstück.
Gibt es einen besseren Weg, oder sogar einige zusätzliche alternative Möglichkeiten, um spezielle bekannte Instanzen einer Klasse zu definieren?
Die einzige Lösung, die ich jetzt kenne, ist die Umsetzung & Set-Accessoren, und überprüfen Sie "ob (das == Waldo) werfen neue ..." auf jeden Satz. Während dies funktioniert, gehe ich davon aus, dass C# eine bessere Arbeit als ich leisten kann. Wenn ich nur einige C# -Wege finden kann, um alle Eigenschaften von Waldo readonly (außer während des statischen Konstruktors) zu machen.
Könnten Sie nicht einfach den Accessor in Ihrer Waldo-Klasse verwenden und den Mutator nicht verwenden? – Brian
Keine direkte Antwort auf Ihre Frage, aber eine mögliche Richtung: http://msdn.microsoft.com/en-us/library/ms750509.aspx und http://stackoverflow.com/questions/263585/immutable-object- pattern-in-c-sharp-what-do-you-think – hatchet
Sie könnten eine Schnittstelle 'IPerson 'definieren und' Waldo' zu einer Klasse machen, die 'IPerson' implementiert, auch' Person' implementiert sie.Dann müssen Sie "Waldo" unveränderlich machen, schauen Sie hier für weitere Informationen, wie Sie eine Klasse unveränderlich machen: http://stackoverflow.com/questions/352471/how-do-i-create-an-immutable-class –