例说C#深拷贝与浅拷贝
生活随笔
收集整理的這篇文章主要介紹了
例说C#深拷贝与浅拷贝
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一開(kāi)始,先對(duì)C#深拷貝與淺拷貝知識(shí)做個(gè)簡(jiǎn)單的總結(jié)。
無(wú)論是淺拷貝與深拷貝,C#都將源對(duì)象中的所有字段復(fù)制到新的對(duì)象中。不過(guò),對(duì)于值類型字段,引用類型字段以及字符串類型字段的處理,兩種拷貝方式存在一定的區(qū)別(見(jiàn)下表)。
?
下面給出完整的演示代碼。
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;namespace DeepCloneExp {class Program{static void Main(string[] args){Person p = new Person() { Name="tiana0",Age=20,Job=new Job(){JobName="Coder"} };Person p1 = p.ShallowClone();Person p2 = p.DeepClone();Console.WriteLine("p淺拷貝-->p1;p深拷貝-->p2");Console.WriteLine("p修改前:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName);Console.WriteLine("p修改前:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName);Console.WriteLine("p修改前:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName);//修改p的所有字段值p.Name = "tiana10000";p.Age = 28;p.Job.JobName = "Manager";Console.WriteLine();Console.WriteLine("p修改后:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName);Console.WriteLine("p修改后:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName);Console.WriteLine("p修改后:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName);}}[Serializable]class Person:ICloneable {public int Age { get; set; } //值類型字段public string Name { get; set; } //字符串public Job Job { get; set; } //引用類型字段//深拷貝public Person DeepClone(){using (Stream objectStream = new MemoryStream()){IFormatter formatter = new BinaryFormatter();formatter.Serialize(objectStream,this);objectStream.Seek(0, SeekOrigin.Begin);return formatter.Deserialize(objectStream) as Person;}}public object Clone(){return this.MemberwiseClone();}//淺拷貝public Person ShallowClone(){return this.Clone() as Person;}}[Serializable]public class Job{public string JobName { get; set; }public override string ToString(){return this.JobName;}} }運(yùn)行程序,得到以下結(jié)果:
先來(lái)看看結(jié)果,很明顯,當(dāng)源對(duì)象改變時(shí),副本只有淺拷貝這種情況下的引用類型字段的值會(huì)一起變化,與前面給出的結(jié)論一致(不記得的話,麻煩再看一下表格)。
?
對(duì)于演示代碼,僅補(bǔ)充說(shuō)明:?Person?類與Job類均需添加標(biāo)志[Serializable],否則運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
好了,就扯到這里了。
轉(zhuǎn)載于:https://www.cnblogs.com/james1207/p/3347924.html
總結(jié)
以上是生活随笔為你收集整理的例说C#深拷贝与浅拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Codeforces 1188A 构造
- 下一篇: C#JsonConvert.Deseri