PowerShell中数组Clear()方法为何会影响已赋值的其他变量?
Why does calling
$V.Clear() affect $A in PowerShell 5.1? 咱们来把这个事儿掰明白——核心原因就是PowerShell里引用类型的赋值逻辑,以及Clear()方法到底在干什么:
先搞懂普通赋值和引用的关系
当你执行$A = $V的时候,对于PowerShell里的数组(本质是System.Object[],属于引用类型),你并没有复制整个数组的内容,只是把$V指向的数组对象的内存引用地址复制给了$A。这时候$A和$V其实是指着同一个数组对象的两个“指针”。
不过平时你给$V重新赋值新数组(比如$V="e","f")的时候,是让$V指向了一个全新的数组对象,而$A还牢牢指着原来的那个数组,所以$A的值不会变——这就是你第一个例子里看到的结果。
为什么Clear()方法会“连累”$A?
Clear()方法和重新赋值完全不一样:它不是让$V指向新对象,而是直接在原数组对象上动手,清空这个对象里的所有元素。因为$A和$V指向的是同一个数组对象,所以$A自然也会看到这个对象被清空后的状态。
你第二个例子里的操作流程就是:
$V="a", "b", "c" # $V指向数组对象X(内容[a,b,c]) $A=$V # $A也指向数组对象X $V.clear() # 直接清空数组对象X的内容 write-host "A after clearing V: $A" # $A指向的X已经空了,所以输出空
第三个例子里,清空后给$V赋值新数组"e","f",只是让$V指向了新的数组对象Y,但$A还是指着被清空的数组对象X,所以$A依然是空的——这也完全符合引用逻辑。
你提到的规避方法为什么有效?
$A=$V.clone():Clone()方法会创建原数组的一个浅拷贝,也就是生成一个新的数组对象,$A指向这个新对象,之后再操作原数组的Clear()就和$A没关系了。Clear-Variable -name V:这个命令是直接清除$V变量本身的引用,而不是修改数组对象,所以$A还是指着原来的数组,不受影响。$V=$null:让$V不再指向原来的数组对象,但原数组对象本身没被修改,$A依然指向它,所以也不会变空。
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

