сделать новый объект из другого объекта без изменения в новом, когда я изменился в старом - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть объект parent тип Border, и я хочу сделать новый объект temp равным parent, но я могу изменить parent без изменений temp

если я напишу Border temp = parent

если я что-то изменил в parent, то изменится в temp

и если я напишу Border temp = new border(parent)

если я что-то изменил в parent, это изменится в temp

это 2 пути не так, я хочу это без изменения температуры

Граница Класс:

int x;
        int y;
        string name;
        List<Element> Border_elements;
        Point[] Border_border;
        BorderUnits[,] borderunitsvalue;
        int Numberofunits;

класс пограничных единиц:

bool isempty;
        int currentelementid;
        int x;
        int y;
        List<int> visitedelementsid;

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Вам нужно клонировать родителя как временную.

Есть несколько способов сделать это:

1) Сделать поверхностную копию с помощью MemberwiseClone

public Border Clone()
{
   return (Border)this.MemberwiseClone();
}

2) Выполните глубокое копирование, сериализовав объект, а затем десериализовав его в новый экземпляр.Для этого мы используем следующий метод:

    /// <summary>
    /// This method clones all of the items and serializable properties of the current collection by 
    /// serializing the current object to memory, then deserializing it as a new object. This will 
    /// ensure that all references are cleaned up.
    /// </summary>
    /// <returns></returns>
    /// <remarks></remarks>
    public static T CreateSerializedCopy<T>(T oRecordToCopy)
    {
        // Exceptions are handled by the caller

        if (oRecordToCopy == null)
        {
            return default(T);
        }

        if (!oRecordToCopy.GetType().IsSerializable)
        {
            throw new ArgumentException(oRecordToCopy.GetType().ToString() + " is not serializable");
        }

        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter oFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

        using (System.IO.MemoryStream oStream = new System.IO.MemoryStream())
        {
            oFormatter.Serialize(oStream, oRecordToCopy);
            oStream.Position = 0;
            return (T)(oFormatter.Deserialize(oStream));
        }
    }

, который можно назвать так:

public Border Clone()
{
   return CreateSerializedCopy<Border>(this);
}
0 голосов
/ 20 декабря 2011

вы хотите взять клон или скопировать объект.

в C #, когда вы назначаете переменную объекту, вы просто ссылаетесь на объект. эта переменная не сам объект. Когда вы назначаете переменную другой переменной, вы просто получаете две переменные, ссылающиеся на один и тот же объект.

Единственный способ сделать так, чтобы один объект совпадал с другим, - создать новый объект и скопировать все состояние другого объекта. Вы делаете это с такими вещами, как MemberwiseClone, методы копирования, присваивание переменных самостоятельно.

(Примечание: структуры разные)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...