登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱 ...
6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
[ 复制链接 ]
莠畅缕
2025-5-29 19:29:20
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
引言
本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱。文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆;最后介绍值类型和引用类型,并说明一些有关它们的重要原理。
最后通过一个简单的示例代码说明装箱拆箱带来的性能损耗。
声明变量的内部机制
在.NET程序中,当你声明一个变量,将在内存中分配一块内存。这块内存分为三部分:1,变量名;2,变量类型;3,变量值。
下图揭示了声明一个变量时的内部机制,其中分配的内存类型依据你的变量类型。.NET中有两种类型的内存:栈内存和堆内存。在接下来的内容中,我们会了解到这两种类型的详细内容。
栈和堆
为了明白什么是栈和堆,先让我们看下下面示例代码的内部机制:
public void Method1(){
// Line 1
int i=4;
// Line 2
int y=2;
//Line 3
class1 cls1 = new class1();
}
复制代码
这里一共有3行代码。让我们一下逐行看一下它们是如何执行的:
第1行:当这行代码执行时,编译器为它分配一小块栈内存。运行时栈负责提供程序所需的内存;
第2行:程序继续执行。如同名字一样,栈在第一块内存的顶部分配了一块内存。你也可以认为是模块或零件一块一块叠起来;
内存的分配与释放遵循后进先出(后进先出)逻辑,换句话说,内存只能在示例中i内存块的顶部分配或释放。
第3行:在第3行,我们创建了一个对象。当该行执行时,编译器在站上创建了一个指针,真实的对象存储在另一种叫“堆”的内存中。"堆"并不跟踪运行内存,它更像一堆随时可以访问的对象。堆用于动态分配内存。这里需要着重说明的是引用指针是分配在栈上。声明Class1 cls1时并不会给Class1的实例分配内存,而是分配一个栈变量cls1(并设置为null),然后把它指向“堆”。
退出方法:当方法退出时,它释放了栈上所有内存变量。换句话说,栈上所有的"Int"变量都依据后进先出的逻辑被释放掉了。要注意,此时不会释放堆内存,这种内存稍后会被“垃圾收集器”释放。
现在可能会有很多朋友奇怪为什么要分配2种内存,而不是仅用一种内存。
如果仔细观察,你会发现基本类型并不复杂,他们值包含简单的值,如i=0。对象数据类型很复杂,它们会引用其它对象或基本类型。换句话说,它要保持其它多种多样的引用,而每种类型必须存在内存中。对象类型需要动态内存而基本类型需要静态内存。如果需要分配动态内存,那么就分配到堆上;反之在栈上。
值类型与引用类型
现在我们明白了栈和堆,接下来看值类型和引用类型。值类型的数据和内存在同一个位置,而引用类型是一个指向内存的指针。
下面示例是一个整形数据类型变量i被赋给另一个整形数据类型变量j。它们的内存值都分配在栈上。当我们把一个int值分配给另外一个int值时,需要创建一个完全不同的拷贝。换句话说,你可以改变其中任何一个而不会影响另外一个。这种数据类型被称为值类型。
当我们创建一个对象,并把一个对象赋给另外一个对象时,它们的指针指向相同的内存(如下图,当我们把obj赋给obj1时,它们指向相同的内存)。换句话说,我们改变其中一个,会影响到另外一个,这种类型称为引用类型。
那么那种类型是值类型和引用类型呢?
在.NET中,依据数据类型,变量被分配到堆或栈上。“string”和"Object"是引用类型,其他基本类型被分配到栈上,是值类型,如下图:
装箱与拆箱
通过上面学习,我们学到了很多有用的东西,其中最有用的是明白了当把数据从栈移动到堆上时会有性能损失。如下图实例,当我们把一个值类型装箱为引用类型时,数据从栈移动到堆上。反之,数据从堆移动到栈上。这种在堆和栈之间的移动带来了性能的损失。数据从值类型转变为引用类型的过程称为“装箱”,反之为“拆箱”。
如果编译上面的代码,在ILDASM中看IL代码就会发下如何进行装箱拆箱操作的,如下:
装箱拆箱的性能影响
为了揭示装箱拆箱如何影响性能,我们把下面代码运行10000次。一个函数有装箱操作,另一个只有简单代码。我们用简单的计时器看它们的运行时间。装箱函数耗时 3542 MS,无装箱操作的耗时2477MS。这说明在实际项目中,除非必须,否则应避免装箱,拆箱操作。
备注:
最近在CodeProject上看到一文,个人觉得非常好,所以就翻一下给不想看英文的同学。由于能力有限,翻译的不好,望大家多多包涵。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
类型
6个
重要的
NET
概念
相关帖子
大疆不同任务类型执行逻辑,上云API源码分析
Flink学习笔记:状态类型和应用
.NET周刊【11月第3期 2025-11-16】
.NET 10 网络堆栈深度架构解析:HTTP/3、性能优化与后量子加密的融合演进
.NET周刊【11月第4期 2025-11-23】
.Net-Avalonia学习笔记(目录)
负载均衡的概念、分类、算法、健康检查机制及高可用解决方案
.NET周刊【11月第5期 2025-11-30】
.NET周刊【11月第5期 2025-11-30】
Aspire 13:从.NET 编排工具到真正的多语言云原生应用平台
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
大疆不同任务类型执行逻辑,上云API源码分析
0
69
迭婵椟
2025-12-12
业界
Flink学习笔记:状态类型和应用
0
171
茹静曼
2025-12-12
业界
.NET周刊【11月第3期 2025-11-16】
1
443
簧横
2025-12-14
业界
.NET 10 网络堆栈深度架构解析:HTTP/3、性能优化与后量子加密的融合演进
0
947
段干叶农
2025-12-14
业界
.NET周刊【11月第4期 2025-11-23】
0
146
浅皮懔
2025-12-15
业界
.Net-Avalonia学习笔记(目录)
0
191
恙髡
2025-12-16
安全
负载均衡的概念、分类、算法、健康检查机制及高可用解决方案
0
289
渭茱瀑
2025-12-16
业界
.NET周刊【11月第5期 2025-11-30】
0
361
背竽
2025-12-16
业界
.NET周刊【11月第5期 2025-11-30】
0
990
闻成
2025-12-16
业界
Aspire 13:从.NET 编排工具到真正的多语言云原生应用平台
0
53
劳欣笑
2025-12-17
回复
(3)
驼娑
2025-11-27 17:28:54
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
yyds。多谢分享
桂册
7 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
东西不错很实用谢谢分享
赖琳芳
前天 15:52
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢分享,辛苦了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
莠畅缕
前天 15:52
关注
0
粉丝关注
27
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
116
读捍卫隐私09匿名指南
63
工作中常用函数详解与示例-PostgreSQL(其他
583
很顶!零成本克隆你的声音,这款B站开源神
672
go语言/golang 自动升级配置
958
函数式编程与传统编程的对比——基于java
227
pgAdmin 后台命令执行漏洞复现及分析(CVE-
855
度假村亲子水上乐园设备哪家质量好?
279
上下文协议(MCP)Java SDK 指南
693
Mac办公效率翻倍?Charmstone教你玩转多任
772
深耕上海14年,专业防水补漏:如何为厂房、
826
【A】字符串
461
一个完全由大模型AI Coding开发而成的程序
698
【Ubuntu】Ubuntu+VScode+ESP-IDF 的环境搭
662
60 秒出高质量科研图!Gemini+DeepSeek 绘
780
追踪链路--使用iptables/ipvs来记录后端pod
159
【译】初探 Visual Studio 2026 全新的用户
321
建筑渗漏治理的标准化实践:基于上海芮生建
53
Aspire 13:从.NET 编排工具到真正的多语言
997
用 .NET 最小化 API 构建高性能 API
397
VonaJS是如何做到文件级别精确HMR(热更新)