从内存变化看.NET代码执行机理(四)
2008-12-07 19:27
190 查看
1 class Program
2 class Program
2 class Program
2 {
3{ x = 15;
5{
11 int a;
12 a = 5;
13 Console.WriteLine("第13行代码:" + a);
14 text(out a);
15 Console.WriteLine("第15行代码:" + a);
16 Console.ReadKey();
17 }
18 }
现在的运行结果是什么?
从内存的角度来看,程序a很简单.其运行结果为
第13行代码:5
第5行代码:5
第7行代码:10
第15行代码:5
疑点如果有的话,应该是在最后第15行代码的输出上,为什么不是10?因为
x在得到text(a);后自己在栈中申请了一份内存,并把a的内容5复制了一份到自己的内容中,然后做5*2操作,最后X的值为10,而a的值一直是5不变.
程序b的运行结果是
第13行代码:5
第5行代码:5
第7行代码:10
第15行代码:10
看起来变化的是第15行代码的输出,其实从内存里面看,机理和程序a完全不一样(实参地址考入形参)
text(ref a)和public static void text(ref int x)表示为传址方式,既x在text(ref a)的时候得到的不是5这个数值,而是存放5的内存地址123456.x从地址123456映射到a中的数值5.如果x做乘2操作,那么系统读取x内存的内容时发现是栈地址123456,将会延着这个地址跟踪操作到a中的数值5.乘2后a中的5变10,x中的地址123456不变.
程序c中的运行结果为
第13行代码:5
第5行代码:15
第7行代码:30
第15行代码:30
其运行机理与程序b正好相反.(形参地址考入实参)
首先申明a在栈中申请一块内存,并赋值5,地址为123456
执行text(out a)--public static void text(out int x)后, x在内存中申请一块内存,同时把x的内存地址考进a的内容中,x的内存内容为空.
然后代码给出定义x=15.x的内存内容刷成15.
后面的计算就简单了,x*2表示从x中15*2=30,表示x最终被刷成30,而a是通过x的内存地址123457指向x的内存内容.所以第7行代码和第15行代码输出都是30.
可以把x=15拿掉测试一下,加深理解!
2 class Program
2 class Program
2 {
3{ x = 15;
5{
11 int a;
12 a = 5;
13 Console.WriteLine("第13行代码:" + a);
14 text(out a);
15 Console.WriteLine("第15行代码:" + a);
16 Console.ReadKey();
17 }
18 }
现在的运行结果是什么?
从内存的角度来看,程序a很简单.其运行结果为
第13行代码:5
第5行代码:5
第7行代码:10
第15行代码:5
疑点如果有的话,应该是在最后第15行代码的输出上,为什么不是10?因为
x在得到text(a);后自己在栈中申请了一份内存,并把a的内容5复制了一份到自己的内容中,然后做5*2操作,最后X的值为10,而a的值一直是5不变.
程序b的运行结果是
第13行代码:5
第5行代码:5
第7行代码:10
第15行代码:10
看起来变化的是第15行代码的输出,其实从内存里面看,机理和程序a完全不一样(实参地址考入形参)
text(ref a)和public static void text(ref int x)表示为传址方式,既x在text(ref a)的时候得到的不是5这个数值,而是存放5的内存地址123456.x从地址123456映射到a中的数值5.如果x做乘2操作,那么系统读取x内存的内容时发现是栈地址123456,将会延着这个地址跟踪操作到a中的数值5.乘2后a中的5变10,x中的地址123456不变.
程序c中的运行结果为
第13行代码:5
第5行代码:15
第7行代码:30
第15行代码:30
其运行机理与程序b正好相反.(形参地址考入实参)
首先申明a在栈中申请一块内存,并赋值5,地址为123456
执行text(out a)--public static void text(out int x)后, x在内存中申请一块内存,同时把x的内存地址考进a的内容中,x的内存内容为空.
然后代码给出定义x=15.x的内存内容刷成15.
后面的计算就简单了,x*2表示从x中15*2=30,表示x最终被刷成30,而a是通过x的内存地址123457指向x的内存内容.所以第7行代码和第15行代码输出都是30.
可以把x=15拿掉测试一下,加深理解!
相关文章推荐
- 从内存变化看.NET代码执行机理(三)
- 从内存变化看.NET代码执行机理(一)
- 从内存变化看.NET代码执行机理
- 【ASP.NET】解决执行<script>代码后页面布局变化问题
- .NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
- ASP.NET(C#) 定时执行一段代码
- 对象实例化,jvm执行时内存变化,
- [ASP.NET]实现在执行完服务端代码后弹出提醒对话框
- 网页调试:myeclipse修改javascript代码后,执行没有变化呀
- 动态执行 VB.NET 和 C# 代码
- C#ASP.NET执行BAT批处理代码
- 让服务器控件执行js与C#两种代码(asp.net)
- .net Button的确认提示按钮执行后台代码
- 禁止在.net framework中执行用户代码。启用“clr enabled” 配置选项
- vb.net用代码创建一个内存表
- [转载代码]VB.NET 中查询 Linq to SQL 执行时的SQL语句
- JVM学习笔记(1、 基本结构;2、Java代码编译和执行的整个过程3、内存管理和垃圾回收 4、 内存调优 )
- Asp.net取得页面执行时间的代码
- 在 ASP.NET 中使用计时器执行用户代码(原创代码)