c#值类型与引用类型
一.引用类型与值类型
值类型是个轻量级类型,引用类型是个 '重量级‘类型。值类型存放的是对象本身,而引用类型存放的对象存放的内存地址
1.内存分配
值类型 的实例一般在线程栈上分配, 引用类型的实例则在托管堆上分配。
注: 值类型的实例并不是一定在线程栈上,和定义的位置也有关系,局部变量和方法参数一定在栈上,但是类的成员变量总是会有类中的其他数据分配在一起,就有可能分配在堆上
C#同C/C++不同,c#是基于.net环境的,称之为托管。因为之前学的是C语言所以很不理解。
比如C语言中变量存放在 堆还是栈中并不是有变量类型来决定。 而是由定义变量的方式。栈中存放局部变量的值,系统进行内存分配回收。堆则是程序员创建,回收。
而在C#托管代码中变量存放内存的位置则不是根据定义变量的方式,他是由实例(C#中用变量类型有些欠妥,用对象实例比较精确点)类型决定的。
C/C++的 堆与栈区别
2. NET FRAMEWORK SDK 文档中已经指明了哪些是引用类型,哪些是值类型
值类型:值类型称为结构或枚举。struct ,Int32,Boolean,Decimal, 、这些结构都是从System.ValueType派生下来的。所有的枚举都是从System.Enum派生下来的
引用类型:类 都是引用类型
3.初始化
值类型变量创建的时候默认是个包含基础类型的值,所有成员被初始化为 0
引用类型变量创建的时候默认是null,表明没有指向一个有效的对象,如果直接使用,会抛出一个NullReferenceException的异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?