Как Вы делаете копию объекта?

Вы можете использовать сдвиг битов, чтобы установить конкретные биты, и двоичные или |, чтобы объединить их:

>>> bin(1 << 2)
0b100
>>> bin(1 << 0)
0b1
>>> bin(1 << 0 | 1 << 2)
0b101

Это позволяет устанавливать биты для каждой записи в списке:

[ 111]

Для больших чисел использование reduce и map может быть быстрее:

>>> from functools import reduce  # loop-augmented-assignment
>>> from operator import __or__  # the | operator
>>>
>>> #         / result |= ...        / 1 << position 
>>> #         v                      v
>>> reduce(__or__, map(lambda pos: 1 << pos, my_list))
5
5
задан Xaisoft 10 March 2009 в 21:36
поделиться

9 ответов

Создайте конструктора копии для Цветов. Затем сделайте это.

Colors objColors = new Colors((Colors)Session["Colors"]);

В Вашем новом конструкторе просто скопируйте значения, что Вы должны и делаете свои другие связанные с конструктором вещи.

То, что происходит в Вашем коде, - то, что Вы получаете указатель на объект Цветов. Сессия ["Цвета"] и objColors указывает на тот же объект в памяти, поэтому когда Вы изменяете один, изменения отражаются в обоих. Вы хотите бренд, шлепающий' новый объект Цветов со значениями, инициализированными от objColors или Сессии ["Цвета"].

править: Конструктор копии мог бы быть похожим на это:

public Colors(Colors otherColors)
{
    this.privateVar1 = otherColors.privateVar1;
    this.publicVar2 = otherColors.publicVar2;
    this.Init();
}
7
ответ дан 18 December 2019 в 08:31
поделиться

Можно реализовать собственные методы клонирования для создания "копии" объекта. Причина это происходит, состоит в том потому что присвоение Colors objColors = Session["Colors"]; ссылочное присвоение, это дизайном. Все, что Вы делаете, делает локальную ссылку объема на объект, который уже существует. Смотрите на IClonable для клонирования фактического объекта. Это не необходимо ни один, что можно реализовать собственные методы копии. Можно также хотеть смотреть на MemberwiseClone в зависимости от того, как глубоко объект идет.

3
ответ дан 18 December 2019 в 08:31
поделиться

Судите конструктора копии.

Пример: ссылка

3
ответ дан 18 December 2019 в 08:31
поделиться

К объекту получает доступ ссылка вместо значением. Посмотрите здесь. Существует несколько способов изменить это. Проверьте сайт для получения дальнейшей информации.

2
ответ дан 18 December 2019 в 08:31
поделиться

Другие ответы все предложили клонироваться так или иначе. Альтернатива, которая может или не может подойти для Вашей конкретной ситуации, должна сделать Ваш тип неизменным. Операции, которые ранее видоизменили Ваш тип, теперь возвратят новый экземпляр типа, беря данные из исходного объекта и внося соответствующие изменения, и оставляя исходный экземпляр неповрежденным. Это - подход что String класс берет, например.

Необходимо будет все еще написать соответствующий код для копирования данных в экземпляре, конечно - но код, работающий с типом, может закончить тем, что был более простым.

Это не может быть соответствующим в Вашем случае, но это - техника, чтобы, по крайней мере, рассмотреть.

2
ответ дан 18 December 2019 в 08:31
поделиться

Это делает это, потому что Вы на самом деле не копируете объект, но копируете ссылку на объект. Можно сделать глубокую копию в C# легко с помощью Двоичной Сериализации:

  public static MemoryStream Serialize(object data)
    {

        MemoryStream streamMemory = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

        formatter.Serialize(streamMemory, data);

        return streamMemory;


    }



   public static Object Deserialize(MemoryStream stream)
    {

        BinaryFormatter formatter = new BinaryFormatter();
        formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
        return formatter.Deserialize(stream);

    }

Вы можете назвать эти два метода первыми взятиями объект и пишете его данные в MemoryStream. Затем можно звонить, Десериализовывают для получения новой копии основанного на объектах на тех данных.

Одна последняя вещь Ваши объекты должны быть сериализуемыми, делает это путем помещения сериализуемого атрибута на каждый объект.

1
ответ дан 18 December 2019 в 08:31
поделиться

Нет пути, встроил и реализовал по умолчанию, но можно получить это путем реализации ICloneable и вызова MemberwiseClone. Это будет только работать на мелкую копию - если Ваш объект будет содержать другие объекты, то необходимо будет клонировать их также. Простая реализация была бы:

public class Bla : ICloneable
{
    string _someFieldToClone;

    object ICloneable.Clone()
    {
        return this.Clone();
    }

    public Bla Clone()
    {
        return (Bla)MemberwiseClone();
    }
}
1
ответ дан 18 December 2019 в 08:31
поделиться

Так как класс Цвета является тем, который Вы создали, и я предполагаю, что Вы довольно плохо знакомы с объектно-ориентированным программированием, можно создать копию construtor как Stuart, сказал с чем-то подобным следующему:

public class Colors
{
  public int Property1;
  public int Property2;
  public int Property3;
  public Colors()
  {
    //Do your regular constructor here
  }
  public Colors(Colors colorToCopy)
  {
    this.Property1 = colorToCopy.Property1;
    this.Property2 = colorToCopy.Property2;
    this.Property3 = colorToCopy.Property3;
  }
}

Клонирование через сериализацию является более обобщенным решением и гарантирует глубокую копию (значение, что это скопирует, делают копии свойств также, а также свойства свойств), но немного более твердо понять imo. С этим решением, если бы Свойства не являются примитивными типами данных, это не были бы копии, если Вы явно не делаете их копиями.

0
ответ дан 18 December 2019 в 08:31
поделиться

Это вызвано тем, что objColors и Сессия ["Цвета"] объекты являются тем же объектом. Если Вы хотите сохранить копию, и сохранять оригинал необходимо сделать объект клонируемым.

Посмотрите следующее ТАК Вопросы и ответы для указателя в правильном направлении:

Глубоко клонирование объектов

0
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: