Powershell Array数组的地址引用问题

时间:2022-06-06 01:21:54

一 将一个数组类型的变量赋值给另一个变量时默认采用地址引用。

导致两个变量最终任意一个做了修改,另一个也跟着被修改。

PS C:\Users\Administrator\Desktop> [System.Collections.ArrayList]$ee = @(1..5)
PS C:\Users\Administrator\Desktop> $ee.IsFixedSize
False
PS C:\Users\Administrator\Desktop> $ee.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ArrayList                                System.Object


PS C:\Users\Administrator\Desktop>
PS C:\Users\Administrator\Desktop> $ff = $ee
PS C:\Users\Administrator\Desktop> $ff.IsFixedSize
False
PS C:\Users\Administrator\Desktop> $ff.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ArrayList                                System.Object


PS C:\Users\Administrator\Desktop> 
PS C:\Users\Administrator\Desktop> $ee.Add(6)
5
PS C:\Users\Administrator\Desktop> $ee
1
2
3
4
5
6
PS C:\Users\Administrator\Desktop> $ff
1
2
3
4
5
6
PS C:\Users\Administrator\Desktop>

这种方式有时候确实有很神奇的功能;单有时候不注意很容易引发bug。那么如何规避呢?


二 不直接将array对象赋值给另一个变量,而是创建新变量然后附加

PS C:\Users\Administrator\Desktop> [System.Collections.ArrayList]$gg = @()
PS C:\Users\Administrator\Desktop> $gg = $gg+$ee
PS C:\Users\Administrator\Desktop> $gg
1
2
3
4
5
6
PS C:\Users\Administrator\Desktop> $ee.Add(7)
6
PS C:\Users\Administrator\Desktop> $gg
1
2
3
4
5
6
PS C:\Users\Administrator\Desktop> $ee
1
2
3
4
5
6
7
PS C:\Users\Administrator\Desktop>

这样新定义的变量就不会随着对方的变化而变化了。


三 与地址引用“相反”的值应用是怎样的现象:

PS C:\Users\Administrator\Desktop> $a = 1
PS C:\Users\Administrator\Desktop> $b =$a
PS C:\Users\Administrator\Desktop> $b
1
PS C:\Users\Administrator\Desktop> $a = 2
PS C:\Users\Administrator\Desktop> $b
1
PS C:\Users\Administrator\Desktop> $a
2
PS C:\Users\Administrator\Desktop>



PS C:\Users\Administrator\Desktop> $Global:aa = 1
PS C:\Users\Administrator\Desktop> $b = $Global:aa
PS C:\Users\Administrator\Desktop> $b
1
PS C:\Users\Administrator\Desktop> $aa = 2
PS C:\Users\Administrator\Desktop> $aa
2
PS C:\Users\Administrator\Desktop> $Global:aa
2
PS C:\Users\Administrator\Desktop> $b
1
PS C:\Users\Administrator\Desktop>


这里只做现象的说明和最简单有效的解决方法;如果有大佬有更好的建议希望能评论区指点下!