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

标签 powershell arraylist

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

相关文章:

c# - 如何让一个方法接受两种类型的数据作为参数?

invoke-sqlcmd 的 Powershell 进度条

powershell - 在 PowerShell 脚本中将参数传递给 SVN

sharepoint - 如何使用 PowerShell 修改 SharePoint 列表中的项目值

azure - 如何使用 Powershell 从本地计算机在 Azure Windows 虚拟机 (VM) 中运行 "sysprep/generalize”?

PowerShell 日期时间不组合字符串 System.Collections.Hashtable.allshift

java - 从数组列表中获取随机单词

java - 多级菜单ArrayLists中对象的循环(Java)

从文件读取注释时,Java ArrayList IndexOutOfBound

java - 我应该如何更改它以从此列表中删除最后一个元素?