C# 函数参数传递分析
来源:互联网 发布:青春期知乎 编辑:程序博客网 时间:2024/06/02 09:28
函数基本的参数传递机制有两种:值传递和引用传递。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实 参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引 用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来 的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
先来看个例子:
namespace ConsoleApplication1{ class ValueTest { static void Main(string[] args) { new ValueTest().test(); new ValueTest().test2(); Console.ReadLine(); } public void test(){ChangeTest t1=new ChangeTest(3);ChangeTest t2=new ChangeTest(5);change(t1,t2);Console.WriteLine(t1.num); } public void test2(){ChangeTest t=new ChangeTest(3);change(t); Console.WriteLine(t.num); } void change(ChangeTest source, ChangeTest dest){source=dest; Console.WriteLine(source.num); } void change(ChangeTest source) { source.num += 1; } class ChangeTest { public ChangeTest(int value) { num = value; } public int num = 0; } }}
分析如下:
在函数void change(ChangeTest source,ChangeTest dest) 中,source保存的是t1的副本,dest保存的是t2的副本。而t1是一个对象的地址,t1的副本也是一个对象的地址与t1指向同一个对象。source=dest只是把t2的副本赋给t1的副本,而t1的值并没有改变,在函数内部source指向的是t2的副本,所以source.num输出5;
而new ValueTest().test()中由于t1的值并没有改变所以t1.num输出3;
在函数void change(ChangeTest source)中source.num+=1,是将 t 的副本指向的ChangeTest对象的值加1,也就是将t指向的ChangeTest对象的值加1,因为t的副本和t指向的是同一个对象,所以new ValueTest().test2()中t.num输出4。
经过以上分析我们得出结论:在C#中函数参数是按值传递的。
- C# 函数参数传递分析
- C#函数传递不定参数
- C# - 函数参数的传递
- C#函数参数传递解惑
- Java 函数参数传递分析
- C#语言函数参数的传递
- C#函数 把 对象作为参数传递
- C#之委托(函数参数传递)
- C语言函数参数传递的分析
- C# - 函数参数的传递(值传递和引用传递)
- 关于C#函数对象参数传递的问题
- C#与c++函数传递参数的比较
- C# 函数参数传递(按值和引用)讲解
- C#调用C函数(DLL)传递参数问题
- C#调用C函数(DLL)传递参数问题
- 关于分析函数参数传递是值传递还是地址传递
- C#中的参数传递
- C#中的参数传递
- 【LFS之步步为营】【三】
- vb.net Access 读写图片
- LAMP环境部署--搭LAMP环境
- SharePoint 2013技巧分享系列 - 隐藏Blog和Apps左侧导航菜单
- 冒泡法
- C# 函数参数传递分析
- 从零开始-边学边做-塔防游戏-七彩三国(九)--加载背景
- Linux 下压缩与解压.zip和.rar及.7z文件
- facebook 获取好友列表
- 生成MyEclipse注册码类
- php的reflection反射机制
- Java开发牛人十大必备网站(转发只为收藏)
- 让sublime text2显示中文的解决方案
- 致2013最后一天