List.Add添加的到底是什麼?。。。其實回頭想想,這不就是我們初學面向對象語言時經常遇到的,對於一個函數形參的指針傳遞與值傳遞問題嗎? ...
前幾日與同事討論一個相對複雜的場景,需要先將中間過程存儲在List中,稍後再用。同時程式類的許多線程共用了一個全局變數。
具體來說就是如下代碼
。。。 _order = order1; _list.Add(_order); 。。。 _order = order2; _list.Add(_order); 。。。 _order = order3; _list.Add(_order); 。。。 _list.ForEach(o => PrintContent(o)); 。。。
對於列印內容,到底是1、2、3不同內容呢,還是都是3的內容?大家意見不一。運行一下看看結果,當然是最簡單的事情,這也不是最重要的。重要的是,玩兒C#這麼多年,對於這麼個簡單的問題,我們都有自己的見解。
一邊認為,既然都是將_order添加進去,而_order又在不斷變化,最後肯定是都是一樣的內容。另一邊認為,記錄的應該是記憶體的實際指向,除非記錄的位置明確被更改,否則不應該變化,不會隨之中間變數的變化而變化。事實證明,後者是正確的。
發散一下,如果是結構體(雖然現在已經用的很少了)的話,情況又有不同。。。如果在list添加進去一個結構體,然後對傳入的中間變數進行更改,並不會反映的list對應的項上。
其實回頭想想,這不就是我們初學面向對象語言時經常遇到的,對於一個函數形參的指針傳遞與值傳遞問題嗎?