关于C#函数对象参数传递的问题
来源:互联网 发布:浙江深孔钻编程招聘 编辑:程序博客网 时间:2024/05/16 01:26
我们知道在.net里class是引用类型,在函数参数表中的对象传递的都是对象的引用,所以在函数体内对其对象参数的修改会影响函数外对应的对象本身,例如下面的程序:
class Program { static void Main(string[] args) { TestClass objA = new TestClass(); objA.Name = "I am ObjA"; Console.WriteLine(String.Format("In Main:{0}", objA.Name)); TestFun(objA); Console.WriteLine(String.Format("In Main:{0}", objA.Name)); Console.Read(); } static void TestFun(TestClass obj) { obj.Name = "I am be modified in TestFun"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name)); } public class TestClass { public string Name { get; set; } } }
将对象objA作为参数传递给函数TestFun,这时传递的是对象objA的引用,所以在函数内对objA的修改会直接应用到这个对象本身。在函数TestFun内修改了形参obj的Name属性,所以在Main中再调用objA.Name时这个属性值就变为在TestFun中修改后的值了。这一点很好理解,运行结果也就是:
如果我们换一种写法:
class Program { static void Main(string[] args) { TestClass objA = new TestClass(); objA.Name = "I am ObjA"; Console.WriteLine(String.Format("In Main:{0}", objA.Name)); TestFun(objA); Console.WriteLine(String.Format("In Main:{0}", objA.Name)); Console.Read(); } static void TestFun(TestClass obj) { TestClass objB = new TestClass(); obj = objB; obj.Name = "I am ObjB"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name)); } public class TestClass { public string Name { get; set; } } }
那结果又将如何呢? 在TestFun中新创建了一个对象objB,接着将obj指向新创建的对象objB并对其的Name属性赋值,所以在TestFun函数体里Console.WriteLine的时候obj.Name应该是“I am ObjB”。那在Main里调用了TestFun(objA)后objA指向的对象到底做了改变没有,它仍旧指向原来的对象还是已经指向了在TestFun里创建的objB呢?
我的猜测是这样的,将objA传递给TestFun传递的实际是objA的地址,在调用TestFun之前的对应关系是:
objA是个变量,他本身的地址是000001,它存放的是objA对象的地址00E001。当调用函数TestFun(objA)时,由于要将objA作为参数传递给TestFun,所以在
栈中就复制一个objA地址的副本,这个副本的地址为000003,他存放的仍旧是objA对象的地址00E001,如图:
所以在TestFun函数中,一开始obj指向的还是objA对象。当在TestFun中创建了一个对象objB后,内存模型变为:
TestFun中执行“obj=objB”后,obj指向objB对象,如下图:
所以执行完TestFun函数后,Main函数中objA仍旧指向原来的objA对象,故运行结果如下:
注:本文中的内存模型仅是个人猜测,肯定有不正确或者不严谨的地方,希望不要误导大家,也欢迎指正。
- 关于C#函数对象参数传递的问题
- 关于函数中参数传递的问题
- 关于js函数的参数传递问题
- Boost关于bind的使用以及函数对象和传递参数的问题
- C#函数 把 对象作为参数传递
- C# - 函数参数的传递
- 关于SOAPpy传递对象参数调用WebService的问题总结
- 关于c#执行mysql操作,传递参数的问题
- 关于c#执行mysql操作,传递参数的问题
- C++中函数参数的对象值传递问题
- 关于函数的参数传递
- 关于函数的参数传递
- c# 参数的传递问题
- 关于二维数组作为参数传递给函数的问题
- 函数参数的传递问题
- 函数参数传递的问题
- 关于javascript函数中参数传递问题
- C++中关于将fstream对象作为函数参数传递相关问题说明
- 微软发布12月安全公告预告 补丁6个
- 请你务必认认真真地看完,或许会有那么一天遇到这种情况的
- c#如何获取当前系统所有的字体和颜色?
- 博弈题 poj 1143
- 微软发布12月安全公告预告 补丁6个
- 关于C#函数对象参数传递的问题
- MFC 中创建简单超链接
- [转]ubuntu下交叉编译环境构建(arm-linux-gcc-3.4.1.tar.bz2 )
- 第01章 CORE C++_C++ 基本结构_注释_输出语句_输入语句_初始化_条件控制_ASCII码值_转义字符_常量_变量_类型长度_运算符
- SQL 语言
- sql与hql的区别
- Windows编程之基础概念篇
- CStdioFile的学习
- ZCull的小启示