值类型和引用类型笔记(连接到栈和堆的芝士点)

从大学就开始学习了值类型和引用类型,就是记不住,也不理解,就知道是编程的术语,根本就不懂。

再加上工作中也没有遇到过(也可能遇到过自己不懂)CTD的,好好搞一搞他。

下面的所以都是来自百度:

C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。

一文读懂C#的 堆、栈、值类型、引用类型

堆栈(其实就是栈)的概念

1、速度上的区别:值类型存取速度快,引用类型存取速度慢。
2、用途上的区别:值类型表示实际数据,引用类型表示指向存储内存堆中的数据的指针或引用(引用类型就要满足三个条件:存在内存堆上的数据==》指针/引用)。
3、来源上的区别:值类型继承自System.ValueType(值不就是Value,这就好记了),引用类型继承自System.Object
4、位置上的区别:值类型的数据存储在内存的中,引用类型的数据存储在内存的中,而内存单元中只存放堆中对象的地址。
5、类型上的区别:值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用
6、保存位置上的区别:值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中
//其实提到栈堆/数据等字眼,就可以联系到值类型了。
堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。 由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时会在堆栈中保存两个完全相同的值;
//引用类型还就是地址,数据的地址,即对象的引用
而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。 在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;
对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作, 如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量

为什么String是引用类型呢? 

在c#中分为值类型和引用类型,值类型为int ,float ,bool ,char ,struct等简单数据类型,引用类型有stirng,class。
然而string的身为引用类型却表现得与值类型十分相同。为什么string为引用类型呢?
首先明白string指向常量空间的地址 如果我们有一个字符串
string a="abcde"; 我们用a给其他字符串赋值:string b=a,c=a,d=a; 那么这样子我们就得到了4个一模一样的字符串"abcde"a b c d都是指向同一块地址。 可是既然string是引用类型,那么a ,b ,c ,d 代表的都是同一个字符串,如果我改变其中一个字符串a="1234",另外的三个由于指向的都是同一个字符串,其他三个也应该是"1234"
但是事实上并不是这样子的,另外三个的值依旧是”abcde“。这样子的话string还能叫做引用类型吗? 答案是string当然是个引用类型。 由于其他三个字符串我们使用 a 去赋值,a ,b , c , d ,指向的都是同一块常量地址。但是常量是不能直接被改变的,
因此我们不能通过直接修改字符串常量来达到我们修改字符串的目的,必须是开辟另一个常量空间存放新的字符常量
因此,当使用 a
="1234"时,a指向的地址改变了
但是b,c,d还是指向原来的同一块空间。这种情况产生的现象使得string和值类型更改值时产生的现象一模一样(如:int k=10;int t=k;t=20;) 引用是一种别名,本质上是指向同一块地址,底层实现是通过指针。

人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
原文地址:https://www.cnblogs.com/ZkbFighting/p/14029156.html