当我在旧的对象中更改时,从另一个对象创建新对象而不更改新对象

时间:2011-12-19 21:54:13

标签: c# object

我的对象parent类型为Border,我希望新对象temp等于parent,但我可以在parent中更改而不更改temp

如果我写Border temp = parent

如果我在parent中更改了任何内容,则会在temp

中更改

如果我写Border temp = new border(parent)

如果我在parent中更改了任何内容,则会在temp

中更改

这两种方式是错误的我想要它而不改变温度

border class:

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

borderunits class:

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

2 个答案:

答案 0 :(得分:1)

您需要将父克隆为临时。

有几种方法可以做到这一点:

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);
}

答案 1 :(得分:0)

你想要克隆或复制对象。

在C#中,当您为对象分配变量时,您只需引用该对象。该变量不是对象本身。当您将变量分配给另一个变量时,您最终会得到两个引用同一对象的变量。

使一个对象与另一个对象相同的唯一方法是创建一个新对象并复制另一个对象的所有状态。你可以使用诸如MemberwiseClone,复制方法,自己分配变量之类的东西。

(注意结构不同)