【问题标题】:powershell hashtable manipulationpowershell 哈希表操作
【发布时间】:2015-07-24 09:55:53
【问题描述】:

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

实际上,当值是简单类型(整数、字符串……)或对象类型时,行为是不同的。当我们使用简单类型并且我们将值影响到变量并更新它时;这不会更新哈希表。但是当我们使用对象类型并且我们将值影响到变量并更新它时;这将更新哈希表。

举个例子会更容易理解^^。

简单类型:

$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}

【问题讨论】:

    标签: powershell hashtable


    【解决方案1】:

    这是因为您使用了reference typesvalue 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 示例。

    【讨论】:

    • 很好的解释。可以肯定的是,字符串的类似值类型的行为源于它们在运行时是不可变的这一事实
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2020-04-17
    • 2019-04-27
    • 2021-05-29
    • 2013-07-19
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多