既然是一个小程序引发的思考,那么我们就先看看这个小程序,看看他有何神奇之处:

namespace ConsoleApplication1
{class Program{static void Main(string[] args){MyClass s = new MyClass();s.val = 10;int i = 20;Console.WriteLine("s.val={0},i={1}",s.val,i);MyMethod(s, i);Console.WriteLine("s.val={0},i={1}", s.val, i);Console.Read();}static void MyMethod(MyClass f1,int f2){f1.val = f1.val + 5;f2 = f2 + 5;}}class MyClass{public int val = 20;}
}

呵呵,大家看了以后可能会感觉这不是很简单的代码吗?有什么特别的地方吗?没有,真没有!但是我想问下大家这两次输出结果会有什么不同吗?分别是什么?有没有得出两次结果都是一样的?这个程序输出的结果是:

可能有些童鞋可能会问,不应该是一样的吗?为什么一个值变了,另外一个没有变呢?这是为什么呢?仔细的同学可能会发现static void MyMethod(MyClass f1,int f2)这个方法两个参数的类型不一样,f1属于引用类型,f2属于类型,是不是因为这个原因才导致两个变量经过同样的处理,s.val的值改变了,i的值却没有变。首先我们了解下什么是值类型,什么是引用类型。

值类型与引用类型(这个面试的时候经常会被问到)

值类型:值类型只需要一段单独的内存,用于存储实际的数据,他存在栈里面

引用类型:引用类型需要两段内存。

  • 第一段存储实际的数据,它总是位于堆中。
  • 第二段是一个引用指向数据在堆中的位置,它通常位于栈中。

那这样说,像上面s对象,它是一个引用类型,那它应该存放在堆中,但是val又是个值类型,那它不是应该存放在栈中吗?

请记住,对于一个引用类型,其实例部分始终存放在堆里。既然val是对象s的一部分,那么它们都会被存放在堆里,无论它们是值类型还是引用类型。

这里顺便介绍下栈和堆

    栈:栈是一个内存数组,是一个LIFO(last-in first- out,后进先出)的数据结构,栈存储几种类型的数据。

  • 某些类型变量的值
  • 程序当前的执行环境
  • 传递给方法的参数

    栈有以下几个特征:

  • 数据只能从栈的顶端插入和删除。
  • 把数据放到栈顶叫入栈(push)。
  • 从栈顶删除数据叫出栈(pop)

    堆:堆是一块内存区域,在堆里可以分配大块的内存用于存储某些的类型的对象。与栈不同,堆里的内存能够任意顺序存入或移除。

    虽然可以在堆里保存数据,但并不能显式地删除它们。CLR的自动GC在判断出程序的代码不会再访问某些数据时,自动清除无主的堆对象。我们因此可以不用操心这项使用其它编程语言时非常容易出错的工作了。

    在介绍了值类型、引用类型与堆和栈,那我们解析下上面程序的执行步骤:

    • 在方法被调之前,用作实参的变量s已经在栈里了。
    • 随着方法的开始,系统在栈中为形参分配空间,并从实参复制值。
    • 因为s是引用类型所以引用被复制,结果实参和形参都引用堆中的同一个对象。
    • 因为i是值类型,所以值被复制,产生了一个独立的数据项。
    • 在方法的结尾,f2和对象f1的字段都被加上5.
    • 方法执行后,形参被从栈中弹出。
    • i,值类型,它的值不受方法行为的影响。
    • s,引用类型,它的值被方法的行为改变了。

    亲爱的童鞋们,你们明白了吗?别看一点小程序,原来深挖可以得出那么多信息。其实也侧面说明了基础的重要性,童鞋们加油吧!

一个小程序引发的思考相关推荐

  1. 一个小需求引发的思考

    此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近接了一个看上去很小,很容易实现的需求,然而在做的过程中发现有些问题如果思考不全就很容易导致问题,这里给大家 ...

  2. [WinForm]写一个小程序把指定目录的程序添加到开机自动启动(无法绕过360检查)

    网友阿东提示了这样一个需求:写一个小程序把指定目录的程序添加到开机自动启动,跳过360 我就到百度上搜了一下:C# 将程序添加到启动项 (写入注册表),及从启动项中删除 - 赤狐(zcm123) - ...

  3. 拼插机器人课和围棋课_我做了一个小程序,里面有各种乐高拼搭图纸和案例

    等产品发出去后,我们陆续收到好多用户的好评. 其中有一位老师的评价最让我感动: 对这样的建议,我举双手双脚欢迎.以前我的课程,比如编程课,就有家长自发组织起来,组织了一帮孩子一起学习,父母在旁边帮忙指 ...

  4. 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么

    原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...

  5. 制作一个查询信息程序_三步学会制作一个小程序

    小程序在刚出现的时候简直是惊艳了整个业界,不管什么内容,光是那酷炫的交互效果就足以篇篇刷屏了,再加上"用完即走",不用安装.不占用内存.入口众多等特性.不过早期由大厂商的专业程序员 ...

  6. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...

    本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...

  7. 一个软件公司需要多少前端_制作一个小程序商城需要多少钱?开发小程序公司哪家强?...

    搭建小程序商城能更好的为商家打造私域粉丝池,形成私域流量,因此,微信小程序自然成为了企业商家的首选. 随着线上的快速发展,微信小程序能力的升级,使小程序也存在多种类型,例如电商类.资讯类.预约类等等, ...

  8. 一个小程序的首页对接后端实现用户注册

    一个小程序的首页对接后端实现用户注册 //index.js //获取应用实例 const app = getApp()Page({globalData: {appid: 'wx4abc8f71681a ...

  9. VS2013安装OpenCV4.1版本并搭建一个小程序

    <VS2013安装OpenCV4.1版本并搭建一个小程序> [注意1] 在"链接器=>输入=>附加依赖库"中,只添加opencv_world410d.lib ...

最新文章

  1. sklearn与pytorch模型的保存与读取
  2. 用 vue 写小程序,基于 mpvue 框架重写 weui
  3. 如何检查加载了哪个版本的jQuery?
  4. 冷板式液冷--术语、定义和缩略语(6-1)
  5. java合并单元格同时导出excel
  6. 256种编程语言大荟萃
  7. python神经网络代码_11行Python代码建立神经网络
  8. wcf 双向 java_我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯...
  9. 基于Java+Swing实现坦克大战游戏
  10. 推荐一个app,收纳杭州最全登山地图!附亲测过的亲子徒步路线推荐
  11. ccs8烧写与擦除dsp2812FLASH的方法
  12. android xp 支付宝自动提现,支付宝商户如何自动提现?
  13. 用一年的数据预测下一年数据_一年的招聘数据中的经验教训
  14. Android关闭屏幕时不锁屏
  15. Excel VBA 实现Ribbon自定义功能区
  16. winget 配置安装路径/卸载等指南
  17. 跨专业考计算机哪个专业好考吗,考研常识:跨专业考研好考专业?
  18. 动画讲解直流无刷电机的原理
  19. JSP教师辅助办公软件教学进程管理系统yeclipse开发mysql数据库bs框架java编程jdbc详细设计
  20. 前端踩坑之TinyMCE富文本编辑器表情插件报错解决

热门文章

  1. 人工智能(Artificial Intelligence)常用算法
  2. (linux中alias的用法)给一些常用的长命令取别名
  3. thinkbook14 2021版有两个显卡
  4. Nat. Commun. 速递:虚拟颅内脑电与神经动力学模型
  5. HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来
  6. 科技议题“破圈”有利还是有弊|观点
  7. 21世纪科技生态面临第三次全球标准
  8. 信息太多,时间太少: 大脑如何区分重要和不重要的事?
  9. The Human Touch 将人工智能和机器人用于病人工作的实际和伦理意义
  10. 城市大脑不仅是AI系统,更是结合人类智慧的混合智能巨系统