我的对象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;
答案 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,复制方法,自己分配变量之类的东西。
(注意结构不同)