关于C#中的浅拷贝Clone和值类型与引用类型的理解


前言

作为一个C#初级程序员,在编写代码的过程中难免会遇到修改了某个变量的值之后,另一个与之相关的变量的值也发生了改变,在较为复杂的程序之中,这样的情况常常会让我们的程序产生一些意想不到的情况,我们在调试程序时难度也较大。而这种情况的发生往往与我们在给变量赋值时的不当操作有关,为了解决这个问题就需要对C#中的引用类型和值类型以及Clone()方法有比较清楚的理解。

一、值类型和引用类型

值类型和引用类型是C#中的基本概念,相关解释非常多,很多文章也讲得很好,所以这里就不再过多去进行解释,在这里简单讲一下自己的理解和几点自己感觉比较重要的点。 ![值类型与引用类型图解](https://img-blog.csdnimg.cn/20210614112358177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3NjgxMA==,size_16,color_FFFFFF,t_70#pic_center) 如上如所示(图片摘自《C#图解教程》),值类型和引用类型主要区别在于数据在内存中的储存位置不同,值类型数据储存在栈中,引用类型数据储存在堆中,而在栈中只储存指向该数据的引用(实际是数据在堆中的地址,也可以理解为C中的指针)。所以我们在将一个引用类型变量赋值给另一个引用类型变量的时候,实际上是在栈中复制了一份引用指向了堆中的同一块数据,因此我们在改变其中一个变量的值的时候,共同指向的这块堆内存中的数据就会被改变,最后导致两个变量的值都发生了改变(在这里string类型是一个特例,详细可以查看“C#中string的不可变性”)。光是这样讲解可能有些抽象,所以我自己也写了一段测试代码来帮助自己加深理解。

二、关于Clone方法的使用和测试

1.Clone方法

首先介绍一下C#中的浅拷贝。浅拷贝对于值类型和String类型成员,浅拷贝会在副本中重新创建成员;对于引用类型,对象和副本对象引用同一个内存地址,当在对象或者副本对象修改引用成员后,引用类型的成员就发生变化。而在C#中浅拷贝就是通过Clone方法来实现的。

2.测试代码

为了直观理解Clone方法的作用和值类型与引用类型的区别,我写了一段代码进行测试:

            string a = "a1";
            string b = a;
            b = "a2";

            int c = 1;
            int d = c;
            d=2;

            Person mike = new Person("Mike");
            Person jack = mike;
            jack.Name = "Jack";

            float[] array1 = {
    1.1f, 1.2f, 1.3f, 1.4f };
            float[] array2 = array1.Clone() as float[];
            for (int i = 0; i < array2.Length; i++)
            {
   
                array2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值