有人可以解释一下,为什么我们在使用哈希表时会有不同的行为?
实际上,当值是简单类型(整数,字符串...)或对象类型时,行为是不同的。当我们使用简单类型时,我们会影响变量的值并更新它;这不会更新哈希表。但是当我们使用对象类型时,我们会影响变量的值并更新它;这将更新哈希表。
使用示例^^会更容易理解。
简单类型:
$hash=@{
a=1
b=2
}
$variable = $hash['a']
$variable = 3
Result: $hash
Name Value
---- -----
a 1
b 2
对象类型:
$hash=@{
a=New-Object PSObject -Property @{ obj=1 }
b=New-Object PSObject -Property @{ obj=2 }
}
$variable = $hash['a']
$variable.obj = 3
Result: $hash
Name Value
---- -----
a @{obj=3}
b @{obj=2}
答案 0 :(得分:7)
这是因为您使用reference types和value types。
对象类型:
$variable = $hash['a']
$variable.obj = 3
在此处检索对象引用,然后访问对象内的属性。
简单类型:
$variable = $hash['a']
$variable = 3
在这里,您将整个int复制到一个新变量。因此,当更新变量时,它会独立更新,而不会影响哈希表。
要更新哈希表的值,您必须使用$hash['a'] = 3
结帐difference between reference types and values types。
编辑:string是特殊的,因为它使用引用保存在堆中,但它的行为类似于值类型。因此,在分配给新字符串时它会被复制,其行为类似于int示例。