Для некоторых классов, в идеале, я хотел бы создать специальные именованные экземпляры, похожие на «null». Насколько я знаю, что это невозможно, так что вместо этого я создаю статические экземпляры класса, со статическим конструктором, подобно этому:C# Как создать специальные экземпляры класса?
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;
}
}
Как вы можете видеть, Person.Waldo это особый случай класс Person, который я создал, потому что в моей программе есть много других классов, которые могут захотеть ссылаться на этот специальный известный экземпляр.
Недостатком реализации этого способа является то, что я не знаю способа сделать все свойства Person.Waldo неизменяемыми, в то время как все свойства «обычного» экземпляра Person должны быть изменены. Всякий раз, когда у меня случайно есть объект Person, относящийся к Waldo, и я небрежно не проверяю, не означает ли это обращение к Waldo, тогда я случайно сжимаю свойства Waldo.
Есть ли лучший способ или даже некоторые дополнительные альтернативные способы определения специальных известных экземпляров класса?
Единственное решение, которое я знаю прямо сейчас, заключается в реализации набора атрибутов get & и проверки «if (this == Waldo) throw new ...» на каждом наборе. Хотя это работает, я предполагаю, что C# может сделать лучше, чем я, для его реализации. Если только я могу найти некоторый способ C#, чтобы сделать все свойства Waldo readonly (за исключением статического конструктора.)
Не могли бы вы просто использовать аксессуар в своем классе Waldo и не использовать мутатор? – Brian
Не прямой ответ на ваш вопрос, но возможное направление: http://msdn.microsoft.com/en-us/library/ms750509.aspx и http://stackoverflow.com/questions/263585/immutable-object- pattern-in-c-sharp-what-do-you-think – hatchet
Вы можете определить интерфейс 'IPerson' и сделать' Waldo' класс, реализующий 'IPerson', а также' Person' реализует его.Затем вам нужно сделать «Waldo» неизменным, посмотрите здесь, чтобы узнать больше о том, как вы делаете класс неизменным: http://stackoverflow.com/questions/352471/how-do-create-an-immutable-class –