一直以来对于值类型和引用类型都只是一个模糊的概念,趁最近有空深入理解了下。

先说说值类型,在msdn上是这样介绍值类型的。

意思就是值类型直接包含值。

变量引用的位置就是值所在内存中实际存储的位置,所以捏,假如你将一个原始变量的值赋给另一个变量,会在新变量的位置创建原始变量的值的一个内存副本。两个变量是不可能引用同一个内存位置滴(除非其中有参数是out 或者ref 参数)。而更改原始变量的值不会影响另一个变量的值,因为变量各有各的存储位置。如下图所示(自己画的有点丑,别介意哈)

翻了下《c#本质论》,很形象生动的描述了下值类型,挺有意思的,一看就懂。

书中说到:值类型的变量就像一张上面写满数字的纸。如果要更改数字,可以擦除它并写上不同的数字。如果还有另外一张纸,就可以把第一张纸上的数字抄过来。但此后,这两张纸就是独立的了。在一张纸上面擦除和替换数字不会影响另一张纸上的数字。

什么是值类型,先看看msdn官方介绍

引用类型的值是对一个对象实例的引用。

引用类型的变量存储的是引用(通常是内存地址),然后通过位置找到对象实例的数据。因为,访问数据的时候,要从变量中读取引用,然后根据引用获取资源,从而到达实际包含实例数据的内存位置。

引用类型的变量关联了两个存储位置:直接和变量关联的存储位置由变量中存储的值引用的内存位置

来我们看图

同值引用类型一样,看了下书,它是这样描述道:引用类型的变量也像是一张上面总是写了东西的纸。例如:假定一张纸上写了家庭地址"123 Sesame Street,New York City".这张纸是一个变量,地址是一栋建筑物的引用。纸和上面写的地址都不是建筑物本身,而且纸在哪里跟纸上的内容所指向的那栋建筑物在哪里是没有任何关系。在另一张纸上复制这个引用,两张纸的内容都指向同一栋建筑物。以后将这建筑物都变成绿色的了,因为引用指向的是同一个事物。

结:值类型的变量直接存储实例的数据。而引用类型,需要根据引用来找到实际数据的存储位置。复制值类型的值会复制所有的数据,这些数据可能很大,而复制引用类型只是复制引用,这个引用是非常小的。所以复制引用类型的效率更高。

感觉写个博客啥的更能加深印象,如果有理解不对的地方欢迎指正。

此文参考过:mdcn官方文档 和《c#本质论(第4版)》

c# 我所理解的 值类型 and 引用类型的更多相关文章

  1. 理解C#值类型和引用类型

    网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家. 工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解.这两天花了不少时间查找资料,看文章,终于有所收获,在此将自己理解整理出来,方便日 ...

  2. C#中值类型与引用类型通俗理解

    关于值类型和引用类型已经有很多人写了很多文章,但是很多人也只是停留在字面上的理解,如果采用一种通俗的方法来解释,想必很多人都会理解.我们都知道值类型存储在栈上,引用类型存储在堆上,引用类型都是xxx类 ...

  3. C++ : 从栈和堆来理解C#中的值类型和引用类型

    C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...

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

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

  5. C#基础知识1-深入理解值类型和引用类型

    C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...

  6. c#基础系列1---深入理解值类型和引用类型

    "大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...

  7. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  8. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  9. JAVA初学(1):值类型和引用类型的区别

    JAVA值类型和引用类型的区别(转)                                                          [定义] 引用类型表示你操作的数据是同一个,也就 ...

随机推荐

  1. 一些gcd计数问题

    数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...

  2. [IOS]cocoapos 两个ruby源的对比

    最近需要使用一些动态类库,cocoapods比较好用,能帮助管理这些类库,百度一下也能找到很多cocoapods配置方法,这里不赘述,我想要讲的是在配置的时候一般都会推荐这样做 $ gem sourc ...

  3. -[NSNull countByEnumeratingWithState:objects:count:]:

    当数组为空时遍历数组容易出这样的问题, -[NSNull countByEnumeratingWithState:objects:count:]: unrecognized selector sent ...

  4. DSY2287*消失之物

    Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 物品装满容积为 x ...

  5. 学习建模 - UML

    最轻量级的工具下载地址 http://staruml.io/download 下载解压依赖:libgcrypt11 https://pan.baidu.com/s/1i3wb6M5 学习地址 http ...

  6. iPhone6/6 Plus兩款大屏智能機

    蘋果終於順應時代潮流,於今年推出了iPhone6/6 Plus兩款大屏智能機.但很快就有人開始懷念老款iPhone的“一手掌控”,畢竟不是所有人都有一雙大手.不過近期就有傳言稱,蘋果將於明年重新推出一 ...

  7. asp.net[web.config] httphandlers 与实现自由定义访问地址

    今天一起来看一个简单的例子,主要是用来实现一个映射功能,我们一般访问一个网址的时候比如是这样的http://localhost:6166/WebSite1/api/request.aspx?strte ...

  8. Myeclipse中web project各种常见错误及解决方法(持续更新)

    创建web project时的问题 error:Install Dynamic web Module Facet卡住 solution:把网络关掉再创建就可以 Servlet error:The se ...

  9. js 的一些知识 摘自http://img0.pconline.com.cn/Pc_intranet/1105/13/313647_7.pdf

    Js 问题分析--js 影响页面性能现状分析:问题陈述分析问题:抽象问题根源,通过实例或推理证明问题的严重性问题引申:以现有问题为点开始扩散,这将导致其它什么问题,或同一类型的问题问题总结:从分散开始 ...

  10. 修改Hosts为何不生效,是DNS缓存?

    Update: 如果浏览器使用了代理工具,修改 Hosts 也不会生效.这里是因为,浏览器会优先考虑代理工具(如添加 pac 文件.SwitchySharp等)的代理,建议调试的时候先关闭这些代理. ...