一 将一个数组类型的变量赋值给另一个变量时默认采用地址引用。
导致两个变量最终任意一个做了修改,另一个也跟着被修改。
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>
这里只做现象的说明和最简单有效的解决方法;如果有大佬有更好的建议希望能评论区指点下!