c# 拷贝结构体_C#深浅拷贝的深入解析

本文深入探讨C#中的深浅拷贝概念,特别是针对结构体的拷贝。浅拷贝仅复制对象字段,修改副本会影响原对象(引用类型除外)。深拷贝则对所有类型重新创建对象,确保修改副本不会影响原对象。通过实例代码展示了如何实现深浅拷贝,并对比了两者在不同数据类型上的行为差异。
摘要由CSDN通过智能技术生成

前言

前面我们学习完了设计模式,在其中我们有了解到原型模式。这里涉及到了克隆自身对象。那么也就是对对象进行拷贝。这里就涉及到了这么一个概念。深浅拷贝、何为深拷贝何为浅拷贝呢?我们一起来看看吧。

浅拷贝

首先我们看看浅拷贝。浅拷贝就是将对象中的所有字段复制到新对象中去,浅拷贝对于值类型和引用类型有不同的影响。值类型的值被复制到副本中后,修改副本中的值不会影响原来对象的值。然而引用类型被复制到副本中的是引用类型的引用。不是引用的对象。这样再修改副本中的值是会导致原来对象的值也被修改了。但是这里引用类型情况我们需要排除字符串String类型。

那么为何引用类型修改副本的值会造成原来对象的值的变化,而string字符串类型却排除在外呢?首先我们需要知道这么一个概念,string类型是一个不可变的数据类型,也就是意味着对字符串对象进行了初始化,该字符串对象就不能改变了。表面上我们修改字符串的内容的方法和运算实际上是创建了一个新字符串,然后根据需要可以把旧字符串的内容复制到新字符串中。怎么理解你?我们看下面这个案例:

#region 字符串比较

///

/// 获取引用类型的内存地址方法

///

///

///

public static string getMemory(object o)

{

GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);

IntPtr addr = h.AddrOfPinnedObject();

return "0x" + addr.ToString("X");

}

///

/// 字符串比较

///

public static void Compares()

{

string a = "123";

Console.WriteLine("a的引用地址:\t\t" + getMemory(a));

string b = "123";

Console.WriteLine("b的引用地址:\t\t" + getMemory(b));

Console.WriteLine("a与b的比较:\t\t" + Object.ReferenceEquals(a, b));

b = "456";

Console.WriteLine("b的引用地址:\t\t" + getMemory(b));

}

#endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值