深浅拷贝的深入解析 摘要:本文主要讲解了C#中的深浅拷贝,通过示例代码详细介绍了浅拷贝和深拷贝的概念和应用场景,并对字符串类型的不可变性进行了深入解析。 浅拷贝是将对象中的所有字段复制到新对象中去,对于值类型和引用类型有不同的影响。值类型的值被复制到副本中后,修改副本中的值不会影响原来对象的值。然而引用类型被复制到副本中的是引用类型的引用,不是引用的对象。这样再修改副本中的值是会导致原来对象的值也被修改了。 例如,在C#中,如果我们将一个对象复制给另一个对象,那么这两个对象将共享同一个引用地址。例如: ```csharp Person p1 = new Person { Name = "John" }; Person p2 = p1; p2.Name = "Jane"; Console.WriteLine(p1.Name); // 输出:Jane ``` 在上面的示例中,我们创建了一个Person对象p1,并将其复制给p2。然后,我们修改了p2的Name属性,结果发现p1的Name属性也被修改了。这是因为p1和p2共享同一个引用地址。 字符串类型是一个不可变的数据类型,这意味着对字符串对象进行了初始化,该字符串对象就不能改变了。表面上我们修改字符串的内容的方法和运算实际上是创建了一个新字符串,然后根据需要可以把旧字符串的内容复制到新字符串中。 例如,在C#中,如果我们创建了一个字符串对象a,并将其复制给b,那么这两个字符串对象将共享同一个引用地址。 ```csharp string a = "123"; string b = a; Console.WriteLine(getMemory(a)); // 输出:0x12345678 Console.WriteLine(getMemory(b)); // 输出:0x12345678 ``` 在上面的示例中,我们创建了一个字符串对象a,并将其复制给b。然后,我们使用getMemory方法获取a和b的引用地址,结果发现它们共享同一个引用地址。 深拷贝是将对象中的所有字段复制到新对象中去,并且递归地复制所有引用类型的对象。深拷贝可以确保新对象和原对象是完全独立的,修改新对象不会影响原对象。 例如,在C#中,如果我们想要深拷贝一个对象,可以使用ICloneable接口的Clone方法。 ```csharp public class Person : ICloneable { public string Name { get; set; } public int Age { get; set; } public object Clone() { return new Person { Name = this.Name, Age = this.Age }; } } Person p1 = new Person { Name = "John", Age = 25 }; Person p2 = (Person)p1.Clone(); p2.Name = "Jane"; Console.WriteLine(p1.Name); // 输出:John ``` 在上面的示例中,我们创建了一个Person对象p1,并使用Clone方法深拷贝了p1到p2。然后,我们修改了p2的Name属性,结果发现p1的Name属性没有被修改。 本文详细讲解了C#中的深浅拷贝,包括浅拷贝和深拷贝的概念和应用场景,并对字符串类型的不可变性进行了深入解析。
- 粉丝: 0
- 资源: 896
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助