2011-04-21 30 views
1

我偶然發現了一些我不太明白的邏輯。讓我們用以下代碼片段:對於每個變量像局部變量?

For Each ds As DerivedScale In List 
    If ds.ScaleID = scaleId Then 
     ds.ScaleID = ds.ScaleID + scaleStep 
     CType(List(myCounter + scaleStep), DerivedScale).ScaleID = scaleId 
     myDerivedScale = ds 
     ds = List(myCounter + scaleStep)   <--------------------- 
     List(myCounter + scaleStep) = myDerivedScale 
     Exit For 
    End If 
    myCounter += 1 
Next 

這篇文章是爲2條記錄改寫位置並更改序號(scaleid)而寫的。箭頭表示問題發生的位置。項目「ds」被更高/更低的對象1索引號替換。但是,這並不影響列表中的該對象。所以當我檢查時,項目ds沒有設置。

但是,當我看着ds.ScaleId = ds.ScaleID + scaleStep時,這反映在列表中。

所以我想知道的是:是「ds」在這裏像一個局部變量,我可以只改變它的屬性嗎?

在此先感謝。

回答

2

ds是對列表中引用的對象的引用。所以當你在它上面設置屬性時,這些改變也反映在列表中。但是因爲ds只是參考,所以在您推測時,更改它所指的內容不會影響列表。

0

.Net中的對象通過引用傳遞。

您的列表中有單個DerivedScale實例; For Each循環遍歷列表中的相同實例。
沒有拷貝;你正在修改對象本身。

0

該變量的作用域爲聲明它的循環。重新分配ds不會改變列表,因爲ds和列表都有對某個項目的對象引用,因此您只是在不影響列表的情況下更改ds引用的項目。

1

您需要通過索引而不是枚舉器遍歷列表(您所獲得的只是參考)。然後,您可以通過索引交換對象並更改其屬性。