C#参数传递、引用类型、值类型等的理解

时间:2021-02-03 18:57:09

本博客不属于技术贴,主要是记录一些自己对不懂得地方的理解和学习的记录,请带着批判的眼光阅读~

值类型存储在栈上,引用类型存储在堆上。栈是由高到低存储的,遵循先进后出的原则,是内存提前分配好的区域,内存的释放不由人控制,用完后就会释放内存。堆是动态分配的内存区域,是无序的,受人为控制释放,但是达到一定内存存储点后,会由GC自动释放内存。

浅拷贝是不完全复制,只会复制*对象,对于值类型浅拷贝是完全复制,对于引用类型是拷贝的引用,不是拷贝引用的对象。深拷贝是完全复制,2个之间互不影响。
比如=就是浅拷贝,如果等号两边的变量都是值类型的,那么改变其中一个的值对另一个不会产生影响,但是如果两边是引用变量,则拷贝的是变量的引用关系,2个变量指向的是同一个对象实例,因此改变一个的内容,另一个也会改变。

参数传递默认是值传递(默认),就是属于浅拷贝,参数的改变与原值没关系。还有另外3中方法ref传递、out传递和params传递。
ref和out改变的是传递参数的方式,将原来的值传递改为引用传递,传递的是对参数变量本身的引用,因此传递的参数内容的改变会导致原值的改变
区别是ref要求在传递前要初始化赋值,在方法内部可以改变
 out不要求传递前赋值,但是必须在返回前进行赋值
都可以返回多个参数,都可以改变传递的参数的原值
params传递用在参数数目可变且类型一样是,传递的参数在传入方法时会被编译成数组的形式

对已声明的变量重新 new重新建一个实例,内存中新开一块区域,引用变量重新指向新实例,引用变量存储的是对该实例的引用的地址值
不加ref和out时:参数传递时类似于对该参数进行了浅拷贝,复制了一份,传递的参数和原值都是指向同一个实例,在方法内对该参数重新new新建实例时,参数指向改变,但是原值的指向不变,如果是在方法内对参数的内容进行改变,则原值同样改变,因为参数和原值是指向的同一个实例