2015-05-27 199 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