日期:2014-05-17  浏览次数:20773 次

一个关于c#中return返回值的问题

namespace 实
{
  class test
  {

  }

  class Program
  {
  static test DO()
  {
  test bar = new test();
  return bar;
  }
  static void Main(string[] args)
  {
  test Newbar = DO();
  }
  }
}
问题1:运行时调用了DO()这个方法,DO()这个方法return了一个test的实例bar然后赋值给Newbar,bar是局部变量再函数运行完以后就撤消了那为什么Newbar还能正常使用呢?
问题2:还有return语句再执行以后函数不是已经完成了吗?那么它是赋值的 呢 return 的数据怎么存储的呢

------解决方案--------------------
http://www.cnblogs.com/jintianzhang/archive/2011/03/29/1998706.html
理解一下
------解决方案--------------------
同楼上,你需要买本C#的基础书籍学习,这里基础问题来问,往往得不到很专业的回答。

我们这些人都觉得很平常的知识,你却不懂,就好比有人问:“人为什么要吃饭睡觉啊”。太简单的问题,又如:“为什么1+1=2啊”。这些问题不是不会回答,而是没有专业的技巧来让那些理解有问题的人来理解。
------解决方案--------------------
问题1:运行时调用了DO()这个方法,DO()这个方法return了一个test的实例bar然后赋值给Newbar,bar是局部变量再函数运行完以后就撤消了那为什么Newbar还能正常使用呢?
----------------------------------
因为bar是引用类型,DO那个方法返回的是bar 的引用,
bar所占的空间在DO方法返回时是会释放的,但实际内容是不释放的,
Newbar 能正常实际用因为获取的是对应引用内的东西,就是实际内容。


------解决方案--------------------
不需要考虑堆栈问题,考虑那个会把自己搞晕的。

.NET中不需要考虑内存释放,都是自动管理的。只有非托管代码才需要考虑。
值类型是直接存放在内存地址里,而引用类型是存放在2处,内存地址里先存放引用地址,然后定位到另一个地址的连续内存空间,那才是引用类型的实际内容。
因此访问值类型例如int,就是直接一次寻址,而访问引用类型如chass a,那就是二次寻址。

return返回的都是第一次寻址的结果,值类型的就返回实际值,而引用类型则返回引用地址。考虑到32位操作系统的引用地址只有32位整型长度,因此这个返回值很小。每次为这个返回值开辟新的内存空间存放也没任何关系,几乎感觉不到内存的使用。

bar是局部变量再函数运行完以后就撤消,但是撤销的是bar的引用地址所占用的内存空间而已,第二级地址的内容还没撤销,因为又有新的对象Newbar指向了它,Newbar里存放了和bar一样的引用地址,2个变量虽然第一级地址不同,但是同时指向同一个引用地址。只有当某个引用地址不被任何对象引用,它才会被释放,这是.NET的潜规则。