C# 关于引用类型的问题
发布网友
发布时间:2022-05-24 22:58
我来回答
共5个回答
热心网友
时间:2023-11-09 21:35
A,B的val都为20
MyClass objectA = new MyClass();//新建MyClass对象objectA
MyClass objectB = objectA;//新建MyClass对象objectB,虽然MyClass的va为值类型,但MyClass本身为类,是一个引用类型,所以这里实际上是把objectA的地址赋值给objectB,此时objectA与objectB指向的是内存中的同一个对象。
objectA.val = 10;//此时objectA与objectB的val全为10
objectB.val = 20;//此时objectA与objectB的val全为20
关于“为什么都是20,而不是都是10呢,不是都调用objectA吗”
这是你对引用类型的错误理解,并不是都调用objectA,而是objectA与objectB都指向内存中的同一个对象,只是给内存中的同一个对象起了两个名字而已
在MyClass objectA = new MyClass();时,在内存中建立了MyClass对象的实例,并将其赋值给objectA.
在MyClass objectB = objectA时,系统并没有再次建立新的MyClass对象的实例,只是将objectA实例的地址赋值给objectB,因为MyClass为引用类型。
所以实际上objectA与objectB共享了内存中的同一个对象,相当于为一个对象起了两个名字,这时,不管你用哪一个名字访问或修改其实都是访问或修改的同一个对象,所以结果都为20.
PS:好像说的有点多了,自己看着都有点晕~见谅见谅~~ -_-
热心网友
时间:2023-11-09 21:35
不需要看class里面的成员类型
只需要看objectA本身是一个类的实例,所以objectA就是引用类型,同理objectB
//===============
MyClass objectA = new MyClass();
//声明了objectA ,并且为它分配了内存地址
MyClass objectB = objectA;
//声明了objectB ,并且将objectA 的内存地址赋给它
//结果就是 这俩公用一块内存地址,暂且称作“内存S”
objectA.val = 10;
//将“内存S”中的val设为10
objectB.val = 20;
//将“内存S”中的val设为20
热心网友
时间:2023-11-09 21:36
实际上用C里面的指针来解释会比较容易明白。
MyClass objectA = new MyClass();
当执行这一句的时候, 创建了一个MyClass类, 我们把objectA当作指针,objectA 指向 了 这个新的 MyClass,我们把它当作 MyClass1
MyClass objectB = objectA;
这一句里面,objectB 指向了 objectA的所指内容,所以此时 两者是指向同一个MyClass,即是 MyClass1
objectA.val = 10;
objectB.val = 20;
之后的两次赋值,实际上都是赋值给了我们前面New 出来的 MyClass1
所以,objectA.val和objectB.val 也即是 MyClass1.val 的值
=====================
楼上几位的解释都已经很到位了。
热心网友
时间:2023-11-09 21:36
打印出来的话,两个都是20,因为是引用型,objectB中保存的是objectA的内存地址,所以你调用objectB就是调用objectA,他们所对应的实际对象是同一个。
---------------------------------
都是20是因为,既然都是操作同一个对象那么总有个先来后到吧?你补充的这个问题问得很没意义
热心网友
时间:2023-11-09 21:37
都是20.
objectA是以MyClass类新实例化的一个对象,在内存中有一个地址空间。
objectB虽然也是一个对象,但没有新开辟一个内存空间,只是指向了objectA的地址空间。
第一次objectA.val=10
第二次objectB.val=20
其实都是对一个数据进行更改,故一改俱改。
如果改为:
MyClass objectA = new MyClass();
MyClass objectB = new MyClass();
objectB = objectA;
objectA.val = 10;
objectB.val = 20;
那就一个是10,另一个是20了