前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >堆和栈的含义,值类型和引用类型

堆和栈的含义,值类型和引用类型

作者头像
zls365
发布2020-08-19 14:12:11
1.4K0
发布2020-08-19 14:12:11
举报
文章被收录于专栏:CSharp编程大全

本文主要是讨论栈和堆的含义,也就是C#的两种类据类型:值类型和引用类型;

一、堆与栈

  • 什么是堆(Heap)?

☞ 堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时或程序运行结束时,通过垃圾回收器(GC)来回收。

☞ 是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

  • 什么是栈(Stack)?

☞ 栈是有顺序的,是一片连续的内存域,保持着先进后出的原则,由系统自动分配和维护。

☞ 是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义。

即, 所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。

 二、值类型与引用类型

  • 概念:值类型直接存储其值在线程栈中,引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。这里需要指出一点:如果一个引用类型中的某个属性是值类型,这个值类型的属性是分配在托管堆上的。
  • 引用类型:基类为Objcet
  • 值类型:均隐式派生自System.ValueType;
  • 值类型与引用类型表:
  • 内存分配            

☞ 值类型变量声明后,无论是否已经赋值,编译器都会为其分配内存。

☞ 引用类型当声明一个类时,只会在栈中分配一小块内存用于存放引用地址,此时并没有为其分配堆上的空间。当类实例化时,分配内存空间,并把堆上空间的地址保存到栈上分配的小块空间中。

☞ 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。

☞ 引用类型的对象总是在进程堆中分配(动态分配)。

  • 示例代码

运行结果

从图中我们可以看出,两个引用类型sc1,sc2都指向同一个托管堆上的空间,所以最后一个指向的会覆盖掉前面的。

而结构是值类型,虽然使用sv2=sv1,把sv1对象赋值给sv2,但是它会在线程栈中分配一个独立的空间,当修改某一个对象的值的时候,不会影响到另一个对象

所以,值类型和引用类型的区别就是:

1、它们存储的位置不一样

2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文主要是讨论栈和堆的含义,也就是C#的两种类据类型:值类型和引用类型;
  • 一、堆与栈
  •  二、值类型与引用类型
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档