gpt4 book ai didi

powershell - Arraylist 是否通过 PowerShell 中的引用传递给函数

转载 作者:行者123 更新时间:2023-12-03 16:32:57 25 4
gpt4 key购买 nike

我今天发现当我从函数内的数组列表中删除一个值时,我传递给函数的数组列表会发生变化。下面的代码似乎暗示传递是通过引用发生的。为什么会这样?这是设计使然还是某种错误? (我在 Win 8.1 上使用 v4)

function myfunction {
param (
[System.Collections.ArrayList]$local
)
"`$local: " + $local.count
"removing 1 from `$local"
$local.RemoveAt(0)
"`$local:" + $local.count
}

[System.Collections.ArrayList]$names=(Get-Content c:\temp\names.txt)

"`$names: " + $names.count
myfunction -local $names
"`$names: " + $names.count

结果:
$names: 16
$local: 16
removing 1 from $local
$local:15
$names: 15

最佳答案

这是设计使然,不是错误。数组、集合和哈希表由 ref 传递。这与添加或删除数组的行为不同的原因是操作在函数作用域内创建了一个新数组。任何时候在函数内创建新变量时,它的作用域都是该函数。 $local.RemoveAt(0) 不会创建新的 $local,它只是调用父脚本中现有 $local 的函数。如果您希望该函数对其自己的 $local 进行操作,则需要在该函数内显式创建一个新的。

因为它是 ref,所以这行不通:

 $local = $local

您仍将在父作用域中引用 $local。
但是您可以使用 clone() 方法创建它的新副本
  function testlocal {
param ([collections.arraylist]$local)
$local = $local.Clone()
$local.RemoveAt(0)
$local
}

$local = [collections.arraylist](1,2,3)

'Testing function arraylist'
testlocal $local
''
'Testing local arraylist'
$local


Testing function arraylist
2
3

Testing local arraylist
1
2
3

关于powershell - Arraylist 是否通过 PowerShell 中的引用传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com