Вы не дублируете объект. Вы создаете новую ссылку на объект. Там все еще только один объект; теперь в вашей коллекции есть две ссылки на него, и любое изменение объекта отражается обеими ссылками.
Чтобы создать новый объект, вы можете вызвать MemberwiseClone()
для всего, что происходит от Object
. Этот метод возвращает новый экземпляр, копируя значения из всех полей исходного объекта. Итак, вы бы сделали:
TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].MemberwiseClone();
У этого метода есть два ограничения. Во-первых, это мелкая копия, т. Е. Все ссылочные поля в исходном объекте имеют свои значения. Поэтому, если a.Foo
является ссылкой на объект Bar
, a.MemberwiseClone().Foo
будет ссылаться на тот же объект Bar
. Во-вторых, метод просто копирует поля; он не вызывает конструктор нового объекта. В зависимости от дизайна класса, это либо неважно, либо действительно большое дело.
Обычно безопаснее сделать так, чтобы класс реализовывал ICloneable
и явно реализовал метод Clone()
, например ::
public TreasureCard Clone()
{
return new TreasureCard
{
Name = this.Name,
Type = this.Type,
...
};
}