在PowerShell中通过引用传递/更新哈希表和数组

时间:2012-11-16 12:32:38

标签: arrays powershell hashtable pass-by-reference

当我了解Perl和PowerShell的不同之处时,我试图通过引用确定传递和更新列表之间的差异。我我现在明白了,PowerShell明智。

通过引用传递哈希表:

调用函数时:没有必要在表的名称前加上[ref]。在函数内:param列表中的表名可以简单地在[hashtable]之前,而不是[ref] - (因为“已收到”它已经是一个引用;所以它被解释为我)。如果要在函数内更新哈希表,则在未使用.Value时不需要[ref]。 IOW:以这种方式调用函数:MyFunction $MyHashTable。该功能包含:

param([hashtable]$HashNameWithinFunction)

$HashNameWithinFunction.Add('x', 'y')

通过引用传递数组:

在调用函数和函数的param()列表中时:数组的名称必须以[ref]开头。要通过引用更新阵列时,必须使用.Value。该函数以这种方式调用:MyFunction ([ref]$MyArray)。该功能包含:

param([ref]$ArrayNameWithinFunction)

$ArrayNameWithinFunction.Value += 'something new'

我的理解是否正确?我已经测试了上述内容,我知道两者都有效。但是,这样做有什么可能会出现一些微妙的错误吗?

在Chrstian中添加以下回复:

function UpdateArray {
    param([ref]$ArrayNameWithinFunction)
    $ArrayNameWithinFunction.Value += 'xyzzy'
}
$MyArray = @('a', 'b', 'c')
UpdateArray ([ref]$MyArray)

1 个答案:

答案 0 :(得分:6)

您的理解是正确的。一点点补充:您按值传递哈希表,因为您将添加它,并且哈希表支持本机添加。数组的大小是不可变的(+=实际上在幕后重新创建数组),所以如果你打算添加,你需要重新创建它,因此需要ref

请记住,最好避免通过引用传递参数。在某些时候,你可能会忘记它是这样做的,并花更多的时间来调试你的代码。如果您需要更改数组,最好在管道上返回新数组。