问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 c++类对象问题 MyClass类定义如下: 假定Mychass为一个类,则执行Myclass a b(2),*p;语句时,自动调用该类构造函数几 3dmax打开文件发生错误 1、假设定义一个类 MyClass,请问:程序中可以有哪几种方式使用这个类 MyClass? 例如有一个类 MyClass,在应用中 “MyClass myclass;”、“MyClass *myclass = new MyClass;”的区别。 已知MyClass为一个类,那么它的构造函数为 、析构函数为 假定Myclass 为一个类,则执行Myclass a,b[2],*p;语句时,自动调用该类的构造函数2次,对么? 银行卡上打过来钱收不到短信怎么办? 假定MyClass为一个类,则该类的拷贝构造函数的声明语句为 C++问题 假如Myclass为一类,执行Myclass a[3],*p[2];语句时会自动调用该类构造函数几次? 网站全部是用html做的 ,是个纯静态页面。所有的内容页面都放在根目录,怎么优化网站,叫百度收录 想一家人自己去故宫,在故宫就玩一天,希望高人指明一条线路 为什么现在广西的爱民螺蛳粉那么火爆? NVIDIA GeForce GT 130m显卡驱动升级到什么版本好? NVIDIA GT130M win10下驱动有吗,找不到 我的电脑自带的NVIDIA Geforce GT130M 用盗版碟重装系统后 显卡会有什么影响吗? 我ideapad y450a tsi的显卡GT130M更新显卡驱动 Nvidia Geforce GT 130M 的最新驱动是什么 Y450a GT130m的显卡 装了新的驱动 显卡温度过高 定义一个类MyClass1,包含一个private整型变量 data和封装这两种属性的两个方法getData()和setDat()。 怎样才能以MyClass为题目写一篇英语作文,但内容是:老师有哪些?同学有哪些?上些什么课? 定义一个类MyClass1 MyClass MyObj=new MyClass()是什么意思? 实例化对象采用MyClass myObject=new MyClass()语法,这个是C#中的语实例化对象的语法 c++程序设计基础 编程实现如下功能: --编写一个MyClass类; --在MyClass类编写 c#中类的问题 一调全屏就黑屏是怎么回事啊,弄了一整天弄 感觉欧尚X7的倒车影像很模糊,这种情况应该怎么办? 怎么在网上写小说啊 《梦幻诛仙手游》各个职业的特点是什么? 梦幻诛仙手游什么职业好 角色职业选择详细分析 梦幻诛仙手游什么职业吃香 职业分析详解 梦幻诛仙手游平民玩什么职业好 全职业分析 最强职业选择推荐 梦幻诛仙手游玩什么职业好 手机和电脑使用同一个,聊天记录能够同步吗? 如何拆液晶背光视频教程 梦幻诛仙手游职业选择 哪个职业最厉害 李子不煮能直接晒么 想做李子干 能不能直接切开了晒 不蒸不煮? 梦幻诛仙手游职业哪个好玩 最强职业推荐