关于值类型和引用类型已经有很多人写了很多文章,但是很多人也只是停留在字面上的理解,如果采用一种通俗的方法来解释,想必很多人都会理解。我们都知道值类型存储在栈上,引用类型存储在堆上,引用类型都是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#中值类型与引用类型通俗理解的更多相关文章

  1. JAVA中值类型和引用类型的不同(面试常考)

    转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...

  2. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  3. C#中值类型和引用类型的差别浅记

    C#中值类型和引用类型的差别浅记         在C#中,变量的类型分为两种.各自是值类型和引用类型.         值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身 ...

  4. .net中值类型、引用类型理解的c#代码示例

    下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...

  5. java中值类型和引用类型的区别

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  6. C#中值类型和引用类型图解

    举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...

  7. C#中值类型和引用类型

    本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...

  8. JavaScript中值类型与引用类型

    JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...

  9. JS中值类型和引用类型

    一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...

随机推荐

  1. iOS学习笔记(十六)——数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  2. sharepoint 2013 自定义列表eventhandle权限控制

    记录一下如何在sharepoint server 2013自定义列表中,使用eventhandle控制自定义列表custom list的条目item权限. ///<summary> /// ...

  3. Android中检测软键盘的弹出和关闭

    Android系统并没有提供明显的API来监听软键盘的弹出和关闭,但是在某些情况下我们还是有办法来检测软键盘的弹出和关闭. 从StackOverflow找到了一个不错的方法.但是这种只适用于在mani ...

  4. 利用jquery对ajax操作,详解原理(附代码)

    1. jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selecto ...

  5. Magnum Kuernetes源码分析(二)

    Kubernetes Master Stack kubernetes master的stack的resources主要分为三个部分. master wait handle wait handle主要用 ...

  6. Cocos2dx使用网络图片

    #ifndef __Demo__Connection__ #define __Demo__Connection__ #include <iostream> #include "c ...

  7. H5与CS3权威下.19 选择器(2)结构性伪类选择器

    1.CSS中的伪类选择器及伪元素 (1)与自定义的class类选择器不同,伪类选择器是CSS中已经定义好的选择器. eg:a:link{color:#ff0000;} (2)伪元素的使用方法: 选择器 ...

  8. Linux环境快速搭建RocketMQ双Master模式

    RocketMQ的集群部署方式有多种,其中包括单个Master.多个Master.多Master多Slave模式(异步复制)以及多Master多Slave模式(同步双写).本次以多Master集群模式 ...

  9. Top 20 JavaScript Projects of 2017

    https://www.youtube.com/watch?v=SUMn8y3pi28 20. AngularJS 1 19. Passport 18. Pug 17. Socket.IO 16. J ...

  10. [Q]“获取AutoCAD安装信息时失败...”解决方法

    “获取AutoCAD安装信息时失败...”解决方法:在“setup.exe”上右键,以管理员权限运行即可.