function test1{
param([System.Collections.ArrayList]$x
)
$x.Add("Test1Add")
write "in Test1 $x"
}
$x=New-Object System.Collections.ArrayList
这是我的代码,在运行test1之后,Result将是:
PS C:\Windows> test1 $x
0
in Test1 Test1Add
PS C:\Windows> $x
Test1Add
我想知道为什么会发生这种情况,我想在调用test1时,就像将一个Reference类型的指针传递给test1一样,就像C#或其他语言一样?值类型如int,我必须使用$ script:x来更改gloabl范围中的x。提前致谢
答案 0 :(得分:0)
$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()
以获得所需的结果。
Value types作为值传递,其他内容作为参考传递。检查var是否为ValueType的最简单方法是执行$var.GetType().IsValueType
。