This artical will also be published in English http://www.cnblogs.com/LarryAtCNBlog/p/4252464.htmlhtml
又或者说是C#? 由于powershell本源就是C#。固然,标题是个伪命题,根据以下MSDN页所述,对于一个array对象来讲,IsFixedSize属性一直就是true的。shell
https://msdn.microsoft.com/en-us/library/system.array.isfixedsize(v=vs.110).aspx数组
换句说话就是array里的成员对象数量是固定的,在powershell里用以下的方法添加对象后其实是复制了一份新数组,而打破了原有的地址指向。测试
$t = 1..2 $r = $t $r[1] = 9 $t # $t的输出为1, 9,由于$r和$t实际上指向的同一个数据,相似于指针 ###### $r += 10 $t # $t的输出依然会是1, 9,由于后台C#所作的其实是复制了一份原有数组加入新的值后赋给了$r
这种数组添加方式真心简单到爆,可是对资源的开销大了很多,不过脚本嘛就要有脚本的样子,简单易用才是正道。spa
可是如上面代码里所说,这种方法虽然简单可是却打破了本来$r和$t指向同一个数组的事实,本来我只须要改动$t或$r任一个里的元素值,另外一个也会跟着变化,可是这种添加元素的方法却clone了一个新数组使得$t和$r指向了不一样的指针。线程
有的时候真得很是须要两个变量指向同一个数组指针一块儿更新数据,好比线程间的通讯,可是元素数量的改动又是必须的,理所固然,会想到array自己可能有方法作这这个吧?事实是有,也同时没有。看以下数组和对象的静态方法,指针
Remove Method void IList.Remove(System.Object value) RemoveAt Method void IList.RemoveAt(int index) # 当使用remove和removeAt的时候会报错说这个collection是fixed size的 Clear Method static void Clear(array array, int index, int length) # 当使用[array]::clear($t, 1, 1)的时候的确能够清空最后一个元素的值,可是数组的成员数量依然不会改变
我想要的只是多个变量指向同一个数组且我能改变数组的成员数量并不影响前一条。code
我以前一直关注在array对象上,想着会不会有什么wonderful方法能直接实现我所想的,事实证实是错误的。因而我转向了IsFixedSize这个属性,想找一找有没有其它对象足够像array可是这个IsFixedSize属性却能够是false的,因而找到了ArrayListhtm
https://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx对象
$t = New-Object System.Collections.ArrayList $t.IsFixedSize # 输出为false
很好,第一步实现了,它是动态的,调用元素的方法也和普通array同样。它填充元素的方法相似于hash table,感受十分友好。
Add Method int Add(System.Object value), int IList.Add(System.Object v...
AddRange Method void AddRange(System.Collections.ICollection c)
Remove Method void Remove(System.Object obj), void IList.Remove(System.Ob...
RemoveAt Method void RemoveAt(int index), void IList.RemoveAt(int index)
RemoveRange Method void RemoveRange(int index, int count)
TrimToSize Method void TrimToSize()
Capacity Property int Capacity {get;set;}
Count Property int Count {get;}
Add是增长单个元素在数组的最后,AddRange则是把另外一个Collection的对象复制到它的最后面,这就解决了元素增长的问题。
Remove* 的3个方法则是在数组中删掉相应的元素,这解决了元素减小的问题。
Count和Capacity属性会随着元素增长而增加,但Capacity不会随着元素减小而自减,Count属性则会,这解决了元素Get and Set的问题。
TrimToSize也就是Align count和Capacity属性,把该数组的capacity置于和count同样。
至此,我以前想要的"多个变量指向同一个数组且我能改变数组的成员数量并不影响前一条"已经实现~~
那么这种对象实现起来这么容易,开销呢?
不管从内存或者说是cpu来讲开销天然也是大很多的,最简单的测试就是开俩powershell分别用这两种办法建一个大数组如1..1000000,而后就能从内存中看出明显的占用区别,至于CPU时间过短直观的感受不容易发现罢了。简单易用的后台是Powershell或者说C#在帮咱们处理而已,固然,以前说起过,脚本就要有脚本的样子,自动化才是关注的重点~~