教学贴:引用类型,值传递,引用传递

於黾 2015-02-06 10:54:23
很多人老是搞不懂引用类型到底是个什么玩意,查MSDN,上网查,基本就是堆栈什么的,枯涩难懂
我就来给大家形象的解释解释什么是引用类型

值类型大家基本都知道是怎么回事,就不赘述了
引用类型不过就是类似硬盘上的文件,比如D:\1.TXT
实例化一个对象(创建文件),它的实例始终只有一个,而路径就是它的引用,引用它的对象可以有很多个(就是一串文本)
你可以在同一个程序里的不同地方使用这个路径,甚至在不同的程序里使用这个路径,但是不管你用了多少次,它都指向的同一个对象

什么是值传递呢?
就是只把路径传递过去
那么我拿到路径之后,通过这个路径把文件改了,传路径过来的地方再去访问这个文件,也同样是改过的
而如果我拿到路径之后不用,而是重新new一个对象(copy了一个文件,叫D:\副本-1.TXT),那么当前的路径(引用)是指向了新的对象,跟原来的没任何关系了,我无论对这个文件如何改,都不影响原来的

什么是引用传递呢?
就是把路径传递回去。
如果路径没变(没有重新copy文件),那么传回去和不传回去其实没有区别,反正没变嘛
如果路径变了,那么把新路径传递回去,那么两个地方就都指向新文件,而旧文件就没用了
...全文
375 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2015-02-25
  • 打赏
  • 举报
回复
从此帖间接看出楼主 准备换下一份工作中。。。 GOOD LUCK
  • 打赏
  • 举报
回复
基于指针的传统编程语言,当它进行值传递的时候,是把对象整个复制到栈上去。然后即使是被调用方法里边把对象内容都给覆盖了,也不过是修改了栈上的内容。那么当方法结束,栈上的东西就丢掉了,不会影响最初的对象。而引用传递,是把指针复制到栈上去,那么被调用方法里边就可以用这个指针为所欲为地覆盖所指向的内容,而谁也不知道。 这类编程语言里边,传引用通常会比传值更快。因为不会向栈复制(可能较大的)对象。 而.net这类托管“安全”的平台(我们不考虑非托管部分),它不允许“知道一个指针就随便覆盖其引用的地址上的数据”,根本没有这类语法操作。因此根本不存在上述传址所可能造成的问题。于是它不管是传值还是传址方式,其实对于引用对象参数传的都是引用,而不存在上述的那种拷贝内容的传值方式。传址与传值的区别,就在被调用方法结束后,是否需要将栈上的参数复制回来(或者说”传回去“)。传值就直接把返回值丢掉了,而传址则需要将栈上的值重新赋值给调用变量。 因此,这类平台下,传值比传址更快。
低丶调 2015-02-24
  • 打赏
  • 举报
回复
还是不懂,
於黾 2015-02-09
  • 打赏
  • 举报
回复
周一了 顶一顶
於黾 2015-02-06
  • 打赏
  • 举报
回复
那么问题来了 传递的时候一共就3种,不加参数,加ref,加out的,都什么意思呢 不加参数,表示只传入,不传出 就是你创建了个文件,然后告诉别人路径,完了。别人只应该去修改你告诉他的这个文件,他不要重新建,建了也白建。 加ref,表示你创建了个文件,告诉别人:你看着办吧,你觉得能用就直接改,不能用就重新建一个,但是不管直接改还是重新建,你改完得把最终的文件名告诉我。 加out什么意思呢,就是你自己不创建文件,告诉别人:你创建个文件吧,创建好了把路径告诉我。
於黾 2015-02-06
  • 打赏
  • 举报
回复
不好 这样解释依然无法令人满意 请忘掉什么程序,什么字符串的 实例对象不过就是硬盘上的一个文件 你自己的电脑就是其中一个引用,你可以随时双击文件打开它看里面的内容 而你也可以把文件夹共享,让别人的电脑也能够看这个文件 你俩看的其实是一个文件,你把文件改了,他看的时候会变。他把文件改了,你看的时候也会变。 什么是引用类型的值传递呢? 就是你创建了一个文件,但是别人不知道你创建的到底是哪个文件,你就把文件名用QQ发给别人,那么别人就可以通过这个文件名访问你电脑上的刚刚你创建的这个文件了 那么如果他不管你发给他的文件名,而是自己创建了个文件修改,修改完又不告诉你,那么你还回头看自己创建的那个文件,其实没变。 什么是引用传递呢? 就是别人觉得你自己创建的这个文件不好,要改还不如重新建个省事,就把你的文件删除了,然后重新建了个文件,弄好了把新的文件名告诉你。你再用新的文件名去打开文件。
zujinsheng 2015-02-06
  • 打赏
  • 举报
回复

7,774

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧