从另一个对象创建新对象,而不改变新对象,当我改变旧对象
本文关键字:对象 改变 新对象 一个对象 创建 | 更新日期: 2023-09-27 18:18:15
我有一个对象parent
类型为Border
,我想让新对象temp
等于parent
,但我可以改变parent
而不改变temp
如果我写Border temp = parent
如果我在parent
中更改了任何内容,那么temp
也会更改
如果我写Border temp = new border(parent)
如果我在parent
中修改了任何内容,那么temp
也会随之改变
这两种方式是错误的,我想要它不改变温度
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;
您需要将parent克隆为temp。
有两种方法可以做到这一点: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);
}
您想要克隆或复制对象。
在c#中,当你将一个变量赋值给一个对象时,你只是引用了这个对象。这个变量不是对象本身。当你把一个变量赋值给另一个变量时,你最终得到的只是两个变量指向同一个对象。
使一个对象与另一个对象相同的唯一方法是创建一个新对象并复制另一个对象的所有状态。您可以使用MemberwiseClone,复制方法,自己分配变量等方法来完成此操作。
(注意结构体不同)