作者Peruheru (还在想)
看板Visual_Basic
标题Re: [.NET] VB.NET中参考及物件的问题
时间Thu May 28 17:38:14 2009
※ 引述《kucom (kucom)》之铭言:
: 感谢P大的回覆
: 看了您的文之後 我整理一下
: (1)
: Dim benz as new car()
: Dim MyCar as car
: MyCar=benz
: MyCar参考指向benz,等於benz这个物件,二者存取同个记忆体配置
没错,虽然理论上可能不该这麽说,但实际结果是这样
: (2)
: Dim benz as new car()
: Dim MyCar as car
: benz=MyCar
: 原本benz有自已的记忆体配置,有自已的资料成员,是执行实体的个体(物件)
: 但benz指向MyCar後,就成了参考,放弃原本的记忆体配置
: 在语法上是没有错的,只是benz由物件成了参考?
: 请问记忆体配置在benz指向MyCar时会自动释放掉吗? 还是一直存在至程式结束?
应该会释放掉,在弃置资源回收时吧
记得之前我也问过这个问题,因为我动态产生的物件非常多
很担心虽然我命令它释放,他却来不及释放的问题
不过似乎是不会这样子
: (3)
: Dim benz as new car()
: Dim ford as new car()
: ford=benz
: 请问如果左右二边都是物件,都有自已的记忆体配置及资料成员,
: 这样的写法有错吗? 语法上有错吗?
: 物件可以去承接物件吗?
: 若可以,这样的写法,会导致个别的记忆体配置如何处理?
: ford与benz都指向同个记忆体配置(benz)吗?
: ford原本的记忆体配置会自动释放掉?
: 或是ford,benz有个别自已的记忆体配置,只是ford的资料成员跟benz一样,
: 等於benz copy一份给ford?
: 感谢大家的解答~
不对,这个Case其实就跟上面的第二个Case一样
差别只在於指向的目标是物件还是Class
不管何者, = 这个动作都会迫使ford放弃自身的所有内容成为某人的别名
只有在有些东西的方法
比如说阵列的clone方法时
会另外制造出一个物件丢给被授与者,也就是等号右端制作一个副本给等号左端
制造出来的副本只有内容跟右边原始物件相同,但是修改不会同时改到两个
写起来就是ford = benz.clone()
但,此时只是将指向得对象换成是一份副本
ford依然会放弃自己的所有资讯来承接这一份副本
而不是单纯的将右边的值给予左边而已
所以你要直接使用=赋值的话
等号左边的东西使用new就会有点多此一举,几乎等於是白做
除非你在赋值前就有需要存取这个东西
或者是赋值的叙述为条件判断,无论如何你都需要存取他
好比说
dim ford as car = new car()
dim bmw as car = new car()
....
..
.
if ford.speed < bmw.speed then
ford = bmw
end if
me.text = ford.speed
像这样的话
就表示一开始存在两辆车
然後比较两者的speed值谁比较厉害
如果ford比bmw差的话
就将你持有的ford内容换成bmw
但是名字还是叫ford
之後你印出你持有那台叫做ford车辆的速度时
实际上就会印出bmw那台车的速度
假如印出前名为bmw的车辆没上油跑不快导致速度低落
那你之後在印出ford这辆车时,印出来的速度值也会跟着低落
因为实际上两者都是同样的一辆车
(若if有成立的话)
那台实际上的可怜ford,在你发现它速度低落时就丢到荒野的路边了
你也把你原本加装的卫星定位改装到bmw上
(BMW本身也有自己的定位,但你习惯用ford的)
你因为失去ford的卫星导航再也找不到这辆车
所以之後这辆车子只能在那边等待托运废车的来拖走
而你不管使用ford的卫星导航或是bmw的卫星导航
都会找到同一辆BMW
除非if判断不成立,不然你一定会失去那台ford
那如果是将ford = bmw 修改成 ford = bmw.clone (假设BMW有clone这种复制方法)
那就会复制出一模一样的另一台BMW,给你装上原本ford的卫星导航
但是刚刚还在得那台ford,还是一样非丢弃不可
所以说从这点来说
如果你只需要拿来承接物件的话
就不需要将承接者也制造成物件
反正最後都会失去刚刚制造出来的物件,根本没差
--
啊对了,什麽是浅层副本啊?
好像是说复制时不会包含某些东西
以这样来说或许完全复制说起来也不对
但是实际上到底有什麽差别呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.234.92
1F:推 kucom:谢谢您喔,讲解很清楚...感谢^^ 06/03 09:39