C#中值类型与引用类型通俗理解
关于值类型和引用类型已经有很多人写了很多文章,但是很多人也只是停留在字面上的理解,如果采用一种通俗的方法来解释,想必很多人都会理解。我们都知道值类型存储在栈上,引用类型存储在堆上,引用类型都是xxx类,值类型都是xxx结构(structure)。下面先放一张图
// 引用类型 因为有class
class SomeRef { public Int32 x; }
// 值类型 因为是struct
struct SomeVal { public Int32 x; }
static void ValueTypeDemo() {
SomeRef r1 = new SomeRef(); // 分配在堆上
SomeVal v1 = new SomeVal(); // 分配在栈上
r1.x = ;
v1.x = ;
Console.WriteLine(r1.x); // 结果为"5"
Console.WriteLine(v1.x); // 同样也是 "5" SomeRef r2 = r1;
SomeVal v2 = v1;
r1.x = ;
v1.x = ;
Console.WriteLine(r1.x); // 结果为"8"
Console.WriteLine(r2.x); // 结果为"8"
Console.WriteLine(v1.x); // 结果为"9"
Console.WriteLine(v2.x); // 结果为"5" }

从代码和图可以看的很清楚,下面我们结合装箱和拆箱谈一谈值类型和引用类型。
通俗一点的理解
一个应用程序的启动可以理解为你开了一个商店,商店的店铺相当于栈,商店的仓库相当于堆,对于有些小的商品,比如打火机之类的,仓库就没必要存货了,而对于手提箱之类的大件,商店里面只是放一个作为展示,当你去商店里面买东西的时候,直接从商店里那,效率是最快的,你在商店里选好了东西去仓库里取,效率就会低一些。想必到这里你就会明白堆和栈了。商店倒闭的时候,商店里面的东西要全部进行处理,而仓库里面的东西需要等待一段时间(GC)。
接下来说一下装箱和拆箱,由于一些特殊的需要,我们需要把值类型转换成引用类型(装箱),引用类型在转换成值类型(拆箱),比如超市里面存包裹,你的包裹由于不能带到超市里面,但是你又不能把你包裹扔掉,所以这时候可以给你提供一个箱子,你把你的包裹存到箱子里面(装箱),然后给你一张存包的卡片,等你购物完成后,就需要凭卡片取出包裹(拆箱)。当然这只是比较通俗的理解,可能跟实际的定义有出入,也希望大家多多提出意见和观点,把技术通俗话有助于我们的理解。
C#中值类型与引用类型通俗理解的更多相关文章
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- C#中值类型和引用类型的差别浅记
C#中值类型和引用类型的差别浅记 在C#中,变量的类型分为两种.各自是值类型和引用类型. 值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身 ...
- .net中值类型、引用类型理解的c#代码示例
下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...
- java中值类型和引用类型的区别
[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...
- C#中值类型和引用类型图解
举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...
- C#中值类型和引用类型
本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- JS中值类型和引用类型
一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...
随机推荐
- JS放大镜特效(兼容版)
原理 1.鼠标在小图片上移动时,通过捕获鼠标在小图片上的位置,定位大图片的相应位置 设计 1.页面元素:小图片.大图片.放大镜 2.技术点:事件捕获.定位 1)onmouseover:会在鼠标指针移动 ...
- Twitter Storm:单机环境的安装与配置
Twitter Storm:单机环境的安装与配置 好久没写博客了,这一段时间一直被导师push着做毕业设计.由于目前的方向偏向于图像识别检索,毕设打算做一个基于分布式计算平台的图像检索系统,查阅相关资 ...
- notes/Set up development environment on windows
恰好前几天买了个新笔记本, 15存 sony vaio, 终于从mac回到了windows. 不过作为(曾经的)*nix追随者, 没有bash真是寸步难行, 幸好windows8.x有了super s ...
- linux下http服务器开发
linux下http服务器开发 1.mystery引入 1)超文本传输协议(HTTP)是一种应用于分布式.合作式.多媒体信息系统的应用层协议 2)工作原理 1)客户端一台客户机与服务器建立连接后,会发 ...
- phper談談最近重構代碼的感受(3)
这篇文章本来该和同一系列的文章一起写的,因为最近换工作的缘故滞后了.重构是非常细碎的叠加,有很多值得注意的地方. 1.消灭过多的临时变量. 有时候过多的无意义的临时变量,真心让人抓狂,特别是过了比较长 ...
- JPA实现分页
JPA实现分页 Jpa自己已经有了实现分页的基本查询方法,只要自己在网上找一个分页的前端插件,然后再用Jpa查询到数据给它. 页面传当前页和每一页的大小给后台,后台就像下面这样处理: public L ...
- 解决安装失败的 Internet Explorer 11
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成.微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章.然而由机器翻译的文章并不总是完美的.它 ...
- SAP CRM 高效调试方法
调试,是程序开发中的基本技巧.快速定位错误消息在源代码中的位置,对发现和解决程序中的问题有着重要的意义.在SAP CRM中,错误消息通常在前台的Web Client页面中展示,应该怎样定位相关代码的位 ...
- LocalDateTime返回的是Local时间
LocalDateTime返回的是本地时间,比如 LocalDateTime startDateTime = LocalDateTime.of(2016, 9, 18,00, 00); 返回的时间格式 ...
- Josephus问题的不同实现方法与总结
/************************************************************************/ /* Josephus问题--数组实现 */ /* ...