4

当我了解 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)
4

1 回答 1

7

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

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

于 2012-11-16T19:21:06.607 回答