Способы создания копии элемента в C#

Стоит задача получить копию класса как объект, чтобы при создании двух объектов типа Character, они были как две самостоятельные сущности и не ссылались на одну область памяти.

Допустим, при создании двух Warrior, они были как два самостоятельных объекта со своими полями и методами.
Character Warrior_1
Character Warrior_2

Какие существуют способы реализации такой задачи; или, может, есть какой-то общий способ.


Ответы (1 шт):

Автор решения: rotabor

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

P. S. А, тогда такие варианты:

partial class Warrior : ICloneable {
    // 1 интерфейс `ICloneable`
    public object Clone() {
        return new Warrior() {
            ValueTypeProperty1 = this.ValueTypeProperty1,
            ReferenceTypeProperty1 = this.ReferenceTypeProperty1.Clone()
        }
    }
    // 2 конструктор копирования
    public Warrior(Warrior warrior) {
        ArgumentNullException.ThrowIfNull(warrior);
        ValueTypeProperty1 = warrior.ValueTypeProperty1;
        ReferenceTypeProperty1 = warrior.ReferenceTypeProperty1.Clone();
    }
    // 3 статический метод копирования
    public static Warrior From(Warrior warrior) {
        return warrior is null ? null : (Warrior)warrior.Clone();
    }
    // 4 конструктор с наилучшими параметрами по умолчанию
    public Warrior() {
        ValueTypeProperty1 = theMostCommonValue;
        ReferenceTypeProperty1 = new ReferenceType1(theBestCommonValue);
    }
}
Warrior_2 = (Warrior)Warrior_1.Clone(); // 1
Warrior_2 = new Warrior(Warrior_1); // 2
Warrior_2 = Warrior.From(Warrior_1); // 3
Warrior_2 = new Warrior(); // 4

У каждого из вариантов есть свои особенности применения.

→ Ссылка