[问题] Var 使用上的一点小问题

楼主: mark0708 (sheep)   2020-02-08 00:34:32
VS 2010 + .NET 4.0
最近在写C# 常常用
foreach (var v in class)
{
string s = v.name;
}
读的时候没什么问题只要传进去的东西已经写好 看起来都OK
问题在指定一个已经初始化的结构时
常常会有针对 结构内成员进行 Array.resize时 用监看视看时
var内的 array 被程式 从 null 被resize成我要的大小
但是原先的 却还是null
ex:
var varTemp = LoadData;
Array.resize( ref v.GroupInfo, 10); // GroupInfo 也是一个结构阵列
// public SomeStruct[] GroupInfo;
在这时去进行监看 会发现 varTemp.GroupInfo 有10组可设定
但是原先的LoadData.GroupInfo 依旧维持 null
但是也不是都这样 另外的 LoadData.metadat[].GroupInfo 两边就都是同步的
目前是先处理完后 多写一行 LoadData = varTemp 去避免这问题...
但是还是问一下有没有人了解原因
作者: s4300026 (s4300026)   2020-02-08 13:33:00
所以resize是回传新物件以游戏比喻:你有个朋友是武器锻造商,你用下列两种方式去请朋友帮你加工新武器。1.1你有把武器,你给它贴上两个标签,分别为 “加工前” 和 “加工后”。1.2你把贴有 “加工后” 标签的武器交给朋友,请它依此为蓝本,打造一把新武器。1.3然后把名为 “加工后” 的标签贴在新武器上!2.1你有个仓库里面有一把贴有 “攻城专用”的武器2.2你跟朋友说你去仓库,找贴有“攻城专用”的武器,并依此打造一把新的2.3把打造好的武器塞回原仓库,然后把贴纸 “攻城专用” 黏到新武器上。----------------------------------------请拿两只笔,两个标签纸模拟上述情境。以上是我觉得这就是原因啦。
楼主: mark0708 (sheep)   2020-02-08 14:53:00
可是resize都已经加上ref 进行操作了...
作者: Litfal (Litfal)   2020-02-08 15:42:00
跟 var 没关系, 它只是语法糖原因在于你的var代表的是一个structure,LoadData和varTemp也是个structure所以你的varTemp = LoadData 也是值复制,而不是址复制
楼主: mark0708 (sheep)   2020-02-09 15:26:00
可是这没办法解释 当中的子结构在varTemp resize时 load也跟着被改变的情况
作者: Litfal (Litfal)   2020-02-10 19:47:00
你是说LoadData.metadat[ ] 吗?
作者: s4300026 (s4300026)   2020-02-11 19:32:00
老实说我以为所有的行为都是shallow copy, 所谓的deep copy要自己写...原po你可以把两种的操作情境的变量名称写完整一点吗?point a,b; a.x=3; b=a; b.x=10; a.x=?所以重点在于 a,b 是两个实体,还是一个实体。如果是class则为一,struct则为2。会null的原因是因为你是走struct copy, 也就是值复制,等号左边的接收者会多产生一个物件, 而不会null 的原因是因为走class copy, 等号左边的接收者只拿到参考的复制品, 因此并没有多复制一个物件出来。 然后你都只有传入左侧的复制者,然后去看右边的人有没有改变,如果是值复制,就不会同步,如果是参考复制,就会同步。第一次你做struct的=, 因此没同步。第二次你做array的=,array的=是class copy, 因此有同步。
作者: Litfal (Litfal)   2020-02-11 20:26:00
建议原po用 object.ReferenceEquals 去比对一下就会理解

Links booklink

Contact Us: admin [ a t ] ucptt.com