惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
腾讯CDC
B
Blog RSS Feed
H
Help Net Security
J
Java Code Geeks
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
博客园 - Franky
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
Martin Fowler
Martin Fowler

博客园 - 带你去月球

【美食技术】家庭自制DIY鸡蛋饼和疙瘩汤早餐视频教程 部分组件无法创建,Scripting.FileSystemObject(FSO)对象的建立基础! Market info 2 LCID. c++ 函数指针 SQL索引 什么是win32编程 DHCP请求IP地址的过程 Ipconfig 用法 cd /d %~dp0是什么意思啊? 什么是托管 GAC&&强命名 - 带你去月球 - 博客园 C#的内存管理:堆栈、托管堆与指针 存储过程 如何获得数据库里所有表的名字 值类型跟引用类型的区别 simple reflection .net framework introduction 禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。 - 带你去月球 system.exe HBKernel32.sys ace1f7.sys 手动清除 病毒
C#值类型与引用类型的区别 _2
带你去月球 · 2008-10-19 · via 博客园 - 带你去月球

C#值类型与引用类型的区别

2008-04-17 15:53

.NET将数据类型分为值类型(value type)引用类型(reference type)

一个具有值类型(value type)的数据存放在内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度

一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度


问     题 值  类  型 引 用 类 型
这个类型分配在哪里? 分配在栈上 分配在托管堆上
变量是怎么表示的? 值类型变量是局部复制 引用类型变量指向被分配得实例所占的内存
基类型是什么? 必须继承自System.ValueType 可以继承自除了System.ValueType以外的任何类型,只要那个类型不是sealed的
这个类型能作为其他类型的基类吗? 不能。值类型是密封的,不能被继承 是的。如果这个类型不是密封的,它可以作为其他类型的基类
默认的参数传递是什么? 变量是按值传递的(也就是,一个变量的副本被传入被调用的函数) 变量是按引用传递(例如,变量的地址传入被调用的函数)
这个类型能重写System.Object.Finalize()吗? 不能。值类型不好放在堆上,因此不需要被终结。 可以间接地重写
我可以为这个类型定义构造函数吗? 是的,但是默认的构造函数被保留(也就是自定义构造函数必须全部带有参数) 当然!
这个类型的变量什么时候消亡? 当它们越出定义的作用域时。 当托管堆被垃圾回收时。

收藏

托管堆的概念:

1 这些都是.NET中CLR的概念,和C#没多大关系。 
2 使用基于CLR的语言编译器开发的代码称为托管代码。 
3 托管堆是CLR中自动内存管理的基础。初始化新进程时,运行时会为进程保留一个连续的地址空间区域。这个保留的地址空间被称为托管堆。托管堆维护着一个指针,用它指向将在堆中分配的下一个对象的地址。最初,该指针设置为指向托管堆的基址。