2015-05-27 136 views
0

奇怪的行爲在這裏,我將數組分配給一個變量的值,然後我改變變量,數組變化也。與字符串和數組

$TestArray = @{ "ValueA" = "A" ; "ValueB" = "B" ; "Number" = "" } 
$TestNumbers = 1..10 

foreach ($number in $testnumbers) { 

    $results = $TestArray 
    $results.Number = $number 
    Write-Host $TestArray.Number 

} 

我認爲$results = $TestArray將採取$TestArray一個拷貝,但此試驗表明,修改$results也改變$TestArray相應的值

誰能幫助我理解這種行爲?

回答

4

否則:

$results = $TestArray 

將使$results一個參考TestArray所指的同一個對象。所以,如果你改變一個,另一個也會受到影響,因爲它們是同一個對象。


爲了反而讓$results一個複製的$TestArray,你可以用它Clone method

$results = $TestArray.Clone() 

而且,只是備案,$TestArray實際上不是一個數組。它是一個hashtable(也稱爲散列映射),其中鍵與值配對。一個陣列會是這樣的:

$TestArray = (1, 2, 3) 
+0

謝謝,我真的很驚訝,我只注意到這種行爲。 它是有道理的。 我想知道是適用於所有字符串數組哈希表和對象的_reference_行爲? – beehaus

+1

這取決於如果有問題的對象可以被突變或沒有。如果它是一個哈希表,那麼是的,因爲你可以添加/刪除項目。如果它是一個不可變的對象,比如一個字符串,那麼不可以,因爲字符串不能被改變(對它們的所有操作都會產生新的對象而不是修改舊的對象)。以下是對可變對象和不可變對象之間區別的解釋:http://en.wikipedia.org/wiki/Immutable_object。 – iCodez