深拷贝与浅拷贝
在C#中的ICloneable中给出的Clone方法只是一个模棱两可的方法,并不足以实现深拷贝和浅拷贝。
深拷贝:
1 2 3 4 5 6 7 | using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, this ); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as Test; } |
使用using开出一段流,将对象序列化。这里没有成功,有兴趣的可以试下。
深拷贝与浅拷贝的根本区别就在于:是否拷贝的是值还是地址。
浅拷贝是两个对象指向同一片地址。
深拷贝是两个对象两个完全不同的地址,但是里面的内容一样。
我的思路是:A类中的字段是B类的对象。直接拷贝A类中的属性,属性是字段的话,重新申明一个B类对象,将A类中B的对象里的拷贝进去。
class Number { public string number { get; set; } public override string ToString() { return this.number; } public Number() { this.number = string.Empty; } public void NumberClone(Number num) { this.number = num.number; } }
在这里,属性不能自己调用自己。如果调用则会陷入死循环。
public Number CabinetNumber
{
get{ return CabinetNumber;}
set{ }
}
class Cabinet { public int No { get; set; } public int Side { get; set; } public string Name { get; set; } private Number _number; public Number CabinetNumber { //get; set; get { if (_number == null) { _number = new Number(); } return _number; } set { } } public void CreateCabinet(Cabinet cabinet) { this.No = cabinet.No; this.Side = cabinet.Side; this.Name = cabinet.Name; Console.WriteLine("this.GetHashCode: " + this.GetHashCode()); Console.WriteLine(); } public Cabinet CreateCabinetNumber(Cabinet cabinet) { //this.No = cabinet.No; //this.Side = cabinet.Side; //this.Name = cabinet.Name; //this.CabinetNumber.NumberClone(cabinet.CabinetNumber); Cabinet cabinetNum = new Cabinet() { CabinetNumber = new Number { } }; cabinetNum.No = cabinet.No; cabinetNum.Side = cabinet.Side; cabinetNum.Name = cabinet.Name; cabinetNum.CabinetNumber.NumberClone(cabinet.CabinetNumber); Console.WriteLine("CreateCabinetNumber里clone: "); Console.WriteLine("this.GetHashCode: " + cabinetNum.GetHashCode()); Console.WriteLine("this.CabinetNumber.GetHashCode: " + cabinetNum.CabinetNumber.GetHashCode()); Console.WriteLine(); return cabinetNum; } public override string ToString() { if (this.CabinetNumber == null) { return string.Format("{0},{1},{2}", this.No, this.Name, this.Side); } return string.Format("{0},{1},{2},{3}", this.No, this.Name, this.Side, this.CabinetNumber.ToString()); } }
主程序代码:
Console.WriteLine("-----CabinetNumber----"); Cabinet cabinetNum = new Cabinet() { No = 12, Name = "cabinet01", Side = 12, CabinetNumber = new Number() { number = "num01" } }; Cabinet cabinetNumClone = new Cabinet() { CabinetNumber = new Number() }; Console.WriteLine("cabinetNum.GetHashCode: " + cabinetNum.GetHashCode()); Console.WriteLine("cabinetNumClone.GetHashCode: " + cabinetNumClone.GetHashCode()); Console.WriteLine(); Console.WriteLine("cabinetNum.CabinetNumber.GetHashCode: " + cabinetNum.CabinetNumber.GetHashCode()); //Console.WriteLine("cabinetNumClone.CabinetNumber.GetHashCode: " + cabinetNumClone.CabinetNumber.GetHashCode()); Console.WriteLine(); Console.WriteLine("--测试---"); //cabinetNumClone = Cabinet.CreateCabinetNumber(cabinetNum); cabinetNumClone = cabinetNumClone.CreateCabinetNumber(cabinetNum); Console.WriteLine("cabinetNum.CabinetNumber.GetHashCode: " + cabinetNum.CabinetNumber.GetHashCode()); Console.WriteLine("cabinetNumClone.CabinetNumber.GetHashCode: " + cabinetNumClone.CabinetNumber.GetHashCode()); Console.WriteLine(); Console.WriteLine("cabinetNum: " + cabinetNum.ToString()); Console.WriteLine("cabinetNumClone: " + cabinetNumClone.ToString()); Console.WriteLine(); Console.WriteLine("-----改变cabinetNumClone------"); cabinetNumClone.CabinetNumber.number = "num01Clone"; cabinetNumClone.Name = "cabinetClone"; Console.WriteLine("cabinetNum.GetHashCode: " + cabinetNum.GetHashCode()); Console.WriteLine("cabinetNumClone.GetHashCode: " + cabinetNumClone.GetHashCode()); Console.WriteLine(); Console.WriteLine("cabinetNum.CabinetNumber.GetHashCode: " + cabinetNum.CabinetNumber.GetHashCode()); Console.WriteLine("cabinetNumClone.CabinetNumber.GetHashCode: " + cabinetNumClone.CabinetNumber.GetHashCode()); Console.WriteLine(); Console.WriteLine("cabinetNum: " + cabinetNum.ToString()); Console.WriteLine("cabinetNumClone: " + cabinetNumClone.ToString());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】