一个关于c#中return返回值的问题
时间:2011-12-11
来源:互联网
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 的数据怎么存储的呢
作者: l198810016 发布时间: 2011-12-11
作者: bdmh 发布时间: 2011-12-11
我们这些人都觉得很平常的知识,你却不懂,就好比有人问:“人为什么要吃饭睡觉啊”。太简单的问题,又如:“为什么1+1=2啊”。这些问题不是不会回答,而是没有专业的技巧来让那些理解有问题的人来理解。
作者: qldsrx 发布时间: 2011-12-11
作者: l198810016 发布时间: 2011-12-11
我想问一个问题你说值类型都是在堆栈上分配内存
那
public class a
{
public int aa; // 再实例化a 以后 这个aa 是存储再那呢 ????
}
还有我问的 RUTURN 这个问题 是这个意思 函数调用 是压栈 那么最先弹出的时候 return 是吧 那么他返回的 那个变量是不是 再栈中临时开辟一块空间用来储存呢
作者: l198810016 发布时间: 2011-12-11
----------------------------------------------------------------------
因为bar是引用类型,DO那个方法返回的是bar 的引用,
bar所占的空间在DO方法返回时是会释放的,但实际内容是不释放的,
Newbar 能正常实际用因为获取的是对应引用内的东西,就是实际内容。
作者: Sandy945 发布时间: 2011-12-11
--------------
aa 存在托管堆,值类型并不总是存在堆栈上的
作者: Sandy945 发布时间: 2011-12-11
---------------------
当方法有返回值并且有变量接收的时候,会有压栈和出栈两个操作
压栈指的记忆方法的返回值,出栈是将返回值赋给对应的变量
作者: Sandy945 发布时间: 2011-12-11
.NET中不需要考虑内存释放,都是自动管理的。只有非托管代码才需要考虑。
值类型是直接存放在内存地址里,而引用类型是存放在2处,内存地址里先存放引用地址,然后定位到另一个地址的连续内存空间,那才是引用类型的实际内容。
因此访问值类型例如int,就是直接一次寻址,而访问引用类型如chass a,那就是二次寻址。
return返回的都是第一次寻址的结果,值类型的就返回实际值,而引用类型则返回引用地址。考虑到32位操作系统的引用地址只有32位整型长度,因此这个返回值很小。每次为这个返回值开辟新的内存空间存放也没任何关系,几乎感觉不到内存的使用。
bar是局部变量再函数运行完以后就撤消,但是撤销的是bar的引用地址所占用的内存空间而已,第二级地址的内容还没撤销,因为又有新的对象Newbar指向了它,Newbar里存放了和bar一样的引用地址,2个变量虽然第一级地址不同,但是同时指向同一个引用地址。只有当某个引用地址不被任何对象引用,它才会被释放,这是.NET的潜规则。
作者: qldsrx 发布时间: 2011-12-11
作者: l198810016 发布时间: 2011-12-11
阿非: 如果没有变量接收呢?? 就不会有出栈操作了?
那样的话,连压栈动作也不会有,这2个动作必须是配对的,否则整个程序的后续操作都要出错。
PS:如果你一定要看堆栈,将代码编译后看IL语言,那个会显示详细的堆栈操作,但是你肯定会看晕。
分别编译2个操作,一个接收,一个不接受,IL语言会显示2种,接收返回值的,有堆栈动作代码,而不接收返回值的,直接结束,无任何堆栈操作。
作者: qldsrx 发布时间: 2011-12-11
有返回值的时候 函数压栈 首先记忆这个返回值 并且给他分配好空间比如说空间A 运行RETURN 时 系统把返回值复制到 A 里...然后函数 结束 ...把A的值 通过= 赋值给 主调函数的变量 然后A 撤销....是不是 ?
作者: l198810016 发布时间: 2011-12-11
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28