C#值类型和引用类型

概念

值类型:直接存储其值。
C#中的值类型:byte,short,int,long,float,double,decimal,char,bool 和 struct
JavaScript中的值类型:Number、String、Boolean、undefined、null

C#中的引用类型:Object、string 和 class等
JavaScript中的引用类型:Array、Object、function、Date、RegExp等
引用类型:存储对其值的引用,类似于指针

特点

值类型:

  1. 占用空间固定,保存在栈中
  2. 保存和复制的是值本身
  3. 使用typeof检测数据类型
  4. 基本类型数据时值类型
  5. 值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
  6. 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。

引用类型:

  1. 占用空间不固定,保存在堆中
  2. 保存和复制的是指向对象的一个指针
  3. 使用instanceof检测数据的类型
  4. 使用new()方法构造出的对象时引用类型
  5. 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
  6. 引用类型的对象总是在进程堆中分配(动态分配)。

值类型和引用类型数据存储数据的过程

1、值类型
在这里插入图片描述
栈,先进后出,由栈底开始写入数据。当定义了一个变量var num=100;时,这时会在1007位置存放100数据。再定义一个var num1=num时,此时会在1006位置增加一个num1,值与num的值相同100。此时将num赋值为200,此时会在1005位置增加一个个num等于200,栈底的num变为为1007,成为一个野值,因为一旦赋值,就不会改变。

2、引用类型:
在这里插入图片描述
引用类型:定义一个数组:var arr=[1,2]; 此时会在堆上面存放引用值[1,2],在栈底1001位置存放引用地址heap1001。当再定义一个arr1等于arr时,会在栈1006位置增加一个arr1,因为引用值和arr相同,所以arr1在栈上存储的也是heap1001,与arr指向同一引用位置。此时在arr中增加一个元素。arr.push(3);会在堆1001位置上增加一个元素3,变为[1,2,3]。如果再另arr=[1,3];这个时候会在堆1002上开辟一个新的内存,存储[1,3]。arr指向新的堆地址heap1002。而arr1依然指向heap1001。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值