最近踩了一個(gè)坑,為了優(yōu)化代碼,把class改為了struct,結(jié)果發(fā)現(xiàn)原來(lái)的初始化語(yǔ)句沒(méi)有預(yù)期的運(yùn)行,偽代碼如下:
public struct A{ bool _isActive; public void Init(bool isActive) { _isActive = isActive; }}
public A[] _arrayA; //調(diào)用如下foreach A a in _arrayA){ a.Init();}
看著是能達(dá)到預(yù)期的,但實(shí)際上不是的。 在foreach里一般都會(huì)拷貝一個(gè)臨時(shí)變量,不同的是,值類型,拷貝出來(lái)的是一個(gè)新的值類型,改變的也是這個(gè)新的值類型,并不是數(shù)組里的內(nèi)容;但引用類型拷貝出來(lái)的還是引用了同一個(gè)內(nèi)容的引用,所以使用新拷貝出來(lái)的引用所做的操作都會(huì)應(yīng)用于我們期望的內(nèi)容上。 所以,還是要使用for循環(huán)來(lái)替換foreach。
for (int i = 0; i < _arrayA.Length; i++){ _arrayA[i].Init();}如果對(duì)這些想深入了解,推薦如下的文章:
http://stackoverflow.com/questions/5663783/in-net-using-foreach-to-iterate-an-instance-of-ienumerablevaluetype-will-c
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注