#c# #.net #pointers #memory #instance-variables
#c# #.net #указатели #память #переменные экземпляра
Вопрос:
Например… У меня есть имя некоторого класса DisplayableUnit
.
Повсюду в коде множество разных переменных указывают на экземпляры этого класса, например:
List<DisplayableUnit> known_units;
DisplayableUnit CopiedUnit;
DisplayableUnit EditingUnit;
DisplayableUnit CurrentUnit;
и т. Д. и т. Д. И т. Д.
Затем, например, мне нужно заменить некоторый instanceA на вновь созданный InstanceB. Возможно ли переписать байты экземпляра класса instanceA, чтобы все другие переменные, ранее указывающие на instanceA, указывали на InstanceB без изменения собственного указателя?
Мне это нужно, потому что у меня ТАК МНОГО переменных, указывающих на экземпляры, поэтому их действительно сложно изменить.
Мой идеальный способ — это что-то вроде: known_units[5] = instanceB; //and after that all other vars will lead onto instanceB
Комментарии:
1. Почему бы вам просто не изменить сам экземпляр? например
known_units[5].Change(...)
2. DisplayableUnit — это очень богатый на поля класс, в котором много экземпляров других классов. Сложно все это изменить.
3. Я не вижу никакого другого решения, не связанного с изменениями во всем коде с использованием экземпляра класса. Кроме того, я не понимаю, в чем сложность создания метода, подобного конструктору, в вашем классе, который перенастраивает все поля…
4. Похоже, вы правы, но я буду надеяться на чудо еще немного.
5. Вместо изменения всех переменных, можете ли вы изменить внутренние компоненты класса DisplayableUnit ? Превратите его в оболочку, которая содержит реальную ссылку на объект и перенаправляет все вызовы. И когда вам нужно изменить экземпляр — измените экземпляр внутри оболочки.
Ответ №1:
Я предлагаю два возможных решения.
Во-первых, это автоматическое изменение исходного объекта, например, с помощью http://valueinjecter.codeplex.com / и, таким образом, не приходится иметь дело с большим количеством полей.
public void Change(DisplayableUnit other)
{
this.InjectFrom(other);
}
Второй способ заключается в том, чтобы все переменные указывали на оболочку типа DisplayableUnit и получали доступ к внутреннему объекту через свойство Value .
public class Wrapper<T>
{
public T Value { get; set; }
}