PowerShell哈希表操作

4

有人能解释一下为什么在使用哈希表时会有不同的行为吗?

实际上,当值为简单类型(整数、字符串等)或对象类型时,行为是不同的。当我们使用简单类型并将值分配给一个变量并更新它时,这不会更新哈希表。但是当我们使用对象类型并将值分配给一个变量并更新它时,这将更新哈希表。

通过一个例子来更好地理解:

简单类型:

$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}
1个回答

7
因为您使用了引用类型值类型
对象类型:
$variable = $hash['a']
$variable.obj = 3

在这里,您检索对象引用,然后访问对象内的属性。
简单类型:
$variable = $hash['a']
$variable = 3

在这里,您将整个int变量复制到一个新变量中。因此,当更新该变量时,它会独立地更新,而不会影响hashtable。 要更新hashtable的值,您必须使用$hash['a'] = 3

查看引用类型和值类型之间的区别

编辑:string很特殊,因为它保存在堆中具有引用,但它的行为类似于值类型。因此,当分配给新字符串时,它会被复制并像int示例一样运行。


1
非常好的解释。但几乎可以确定,字符串的值类型行为源于它们在运行时是不可变的。 - Mathias R. Jessen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接