值类型struct在foreach中的陷阱_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 值类型struct在foreach中的陷阱

值类型struct在foreach中的陷阱

 2015/4/28 21:17:25  玉生  程序员俱乐部  我要评论(0)
  • 摘要:最近踩了一个坑,为了优化代码,把class改为了struct,结果发现原来的初始化语句没有预期的运行,伪代码如下:publicstructA{bool_isActive;publicvoidInit(boolisActive){_isActive=isActive;}}publicA[]_arrayA;//调用如下foreachAain_arrayA){a.Init();}看着是能达到预期的,但实际上不是的。       
  • 标签:for 陷阱 值类型

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

上一篇: 我国高分二号等多颗卫星联合监测震区 下一篇: 没有下一篇了!
发表评论
用户名: 匿名