最近踩了一个坑,为了优化代码,把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