手机版

asp.net(C#)函数对象参数传递中的问题

时间:2021-10-25 来源:互联网 编辑:宝哥软件园 浏览:

复制的代码如下:类程序{ static void main(string[]args){ test class obja=new test class();objA。名称='我是ObJa ';控制台。写线(字符串。格式(' In Main:{0} ',objA。姓名));test fun(ObJa);控制台。写线(字符串。格式(' In Main:{0} ',objA。姓名));控制台。read();}静态void TestFun(TestClass obj) { obj。名称=“我将在TestFun中被修改”;控制台。写线(字符串。格式('在TestFun:{0} '中,obj。姓名));}公共类TestClass {公共字符串Name { get设置;}}}将对象objA作为参数传递给函数TestFun,再传递对象objA的引用,这样函数中对objA的修改会直接应用到对象本身。形式参数obj的Name属性在函数TestFun中被修改,所以当objA。在Main中再次调用Name,属性值变成TestFun中的修改值。这个很好理解,运行结果是:image

如果换个说法:复制代码如下:类程序{ static void main(string[]args){ test class obja=new test class();objA。名称='我是ObJa ';控制台。写线(字符串。格式(' In Main:{0} ',objA。姓名));test fun(ObJa);控制台。写线(字符串。格式(' In Main:{0} ',objA。姓名));控制台。read();} static void TestFun(TestClass obj){ TestClass ObJb=new TestClass();obj=objB物体。名称='我是ObJb ';控制台。写线(字符串。格式('在TestFun:{0} '中,obj。姓名));}公共类TestClass {公共字符串Name { get设置;}}}结果会怎样?在TestFun中,新创建了一个对象objB,然后obj指向新创建的对象objB,并分配了它的Name属性,所以obj。当控制台时,名称应该是“我是ObjB”。WriteLine在TestFun函数体中。在Main中调用TestFun(objA)后,objA指向的对象有变化吗?它仍然指向原始对象还是已经指向了在TestFun中创建的objB?我猜objA的地址其实是传递给TestFun的,调用TestFun之前的对应关系是:image

objA是一个变量,它自己的地址是000001,它存储ObjA对象的地址00E001。当调用函数TestFun(objA)时,因为objA要作为参数传递给TestFun,所以objA地址的副本被复制到堆栈中。这个副本的地址是00003,它仍然存储objA对象的地址00E001,如图所示:image

因此,在TestFun函数中,obj最初指向objA对象。在TestFun中创建对象objB时,内存模型变成:image

在TestFun中执行“obj=objB”后,obj指向objB对象,如下所示:image

所以在执行TestFun函数后,Main函数中的objA仍然指向原来的objA对象,所以运行结果如下:image

注意:本文的记忆模型只是个人猜测,肯定有不准确或不精确的地方。希望大家不要误导大家,欢迎大家指正。

版权声明:asp.net(C#)函数对象参数传递中的问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。