前言
作为一个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[i] += 1;
}
Person[] perArray1 = {