在Powershell中传递引用类型参数


 function test1{
     param([System.Collections.ArrayList]$x
     )
     $x.Add("Test1Add")
     write "in Test1 $x"
 }
$x=New-Object System.Collections.ArrayList

这是我的代码,运行test1后,结果将是:

PS C:Windows> test1 $x
0
in Test1 Test1Add
PS C:Windows> $x
Test1Add

我想知道为什么会发生这种情况,我想在调用test1时,就像将引用类型的指针传递给test1一样,就像C#或其他语言一样?像int这样的值类型,我必须使用$script:x来更改全局范围内的x。提前致谢

使用引用变量:

  $x=New-Object System.Collections.ArrayList
  function test( [ref][System.Collections.ArrayList]$x) { $x.value.Add($(get-random)) }
  test ([ref]$x)
  test ([ref]$x)
  $x

编辑

我误解了这个问题,你想要相反。在上述情况下,结果相同,但对于值类型则不同。如果您希望上面的函数不更改引用的对象,则需要在函数中克隆它。可能有一个Clone功能,但在某些情况下,您必须手动创建克隆。在这种情况下,有这样的方法,因此您可以在上述函数的开头添加$x=$x.Clone()以获得所需的结果。

类型作为值传递,其他内容作为引用传递。检查 var 是否属于 ValueType 的最简单方法是执行$var.GetType().IsValueType

最新更新