我們定義&SdtUser1,&SdtUser2 爲&SdtUser類型,Collection = false
如:&SdtUser1.UserCod = '0001'
&SdtUser2 = &SdtUser1.Clone()//這句執行有效
msg(&SdtUser2.UserCod)//執行,彈出0001
&SdtUser2.UserCod = '9999'
msg(&SdtUser1.UserCod)//執行,彈出 0001
msg(&SdtUser2.UserCod)//執行,彈出9999
可見,克隆後,改變新變量的值,不影響原變量。他們實際上在內存上是不同的地址。
如果我們定義集合的sdt類型,情況就有所不同
我們結構體類型SDT(Struct Data Type)定義如下 :
SdtTest Colletion(True)
ColA v(20)
ColB N(10)
ColC D(8)
我們再定義如下變量:
&SdtT1 ,&SdtT2 ( 類型爲SdtTest )
&SdtT1Item,&SdtT2Item ( 類型爲SdtTest.Item )
&i ( 類型爲 N(10) )
代碼如下:
for &i = 1 to &SdtT1.Count
&SdtT1Item = &SdtT1.Item(&i)
&SdtT2.Add(&SdtT1Item.Clone())
endfor
或者
for &SdtT1Item in &SdtT1
&SdtT2.Add(&SdtT1Item.Clone())
endfor
經過clone後,&sdtT1 和 &sdtT2的內容是一致的,但是他們所指向的內存地址不一樣。達到了數據的完全複製
,兩者獨立,即修改了&sdtT2不影響&sdtT2的值。
千萬要注意:我們不能對集合sdt直接用clone()賦值 ,如: &sdtT2 = &sdtT1.Clone()
不妨大家試試!
Specify 沒有問題,編譯也沒有問題執行也沒問題,但是克隆出來我們需要調用數據,如 msg(&sdtT2.item(1).ColA),執行後會出錯,報
java.lang.NullPointerException
這說明&sdtT2 = &sdtT1.Clone()沒有執行效果,即&sdtT2沒有分配到內存地址。
只能用add方法。即&SdtT2.Add(&SdtT1Item.Clone())
結論:我們可以這樣理解,clone的原對象必須是子集或非集合型。
如&SdtT1Item是子集,&SdtUser 本身就不是集合,當然是非集合型