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
。