mar*_*017 2 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')
Run Code Online (Sandbox Code Playgroud)
通过引用传递数组:
无论当函数被调用,并在功能的param()列表:数组的名称必须在前面加[ref].当通过引用更新数组时,.Value必须使用.该函数以这种方式调用:MyFunction ([ref]$MyArray).该功能包含:
param([ref]$ArrayNameWithinFunction)
$ArrayNameWithinFunction.Value += 'something new'
Run Code Online (Sandbox Code Playgroud)
我的理解是否正确?我已经测试了上述内容,我知道两者都有效.但这样做有什么可能会有一些微妙的错误吗?
添加Chrstian的以下回复:
function UpdateArray {
param([ref]$ArrayNameWithinFunction)
$ArrayNameWithinFunction.Value += 'xyzzy'
}
$MyArray = @('a', 'b', 'c')
UpdateArray ([ref]$MyArray)
Run Code Online (Sandbox Code Playgroud)
你的理解是正确的.一点点补充:您按值传递哈希表,因为您将添加它,并且哈希表支持本机添加.数组在大小方面是不可变的(+=实际上是在幕后重新创建数组),所以如果你打算添加,你需要重新创建它,因此需要ref.
但请记住,最好避免通过引用传递参数.在某些时候,你可能会忘记它是这样做的,并花更多的时间来调试你的代码.如果需要更改数组,最好在管道上返回新数组.