最近踩了一個坑,為了優化代碼,把class改為了struct,結果發現原來的初始化語句沒有預期的運行,偽代碼如下:
public struct A { bool _isActive; public void Init(bool isActive) { _isActive = isActive; } }
public A[] _arrayA; //調用如下 foreach A a in _arrayA) { a.Init(); }
看著是能達到預期的,但實際上不是的。
在foreach裡一般都會拷貝一個臨時變量,不同的是,值類型,拷貝出來的是一個新的值類型,改變的也是這個新的值類型,並不是數組裡的內容;但引用類型拷貝出來的還是引用了同一個內容的引用,所以使用新拷貝出來的引用所做的操作都會應用於我們期望的內容上。
所以,還是要使用for循環來替換foreach。
for (int i = 0; i < _arrayA.Length; i++) { _arrayA[i].Init(); }
http://stackoverflow.com/questions/5663783/in-net-using-foreach-to-iterate-an-instance-of-ienumerablevaluetype-will-c