枚举器的行为会根据我们引用它的方式而改变吗?在类中包含对列表枚举器的引用似乎会改变它的行为。匿名类的例子:publicstaticvoidMain(){varlist=newList(){1,2,3};varan=new{E=list.GetEnumerator()};while(an.E.MoveNext()){Debug.Write(an.E.Current);我希望它打印“123”,但它只打印零并且永远不会终止。具体类的相同示例:publicstaticvoidMain(){varlist=newList(){1,2,3};varan=newFoo(){E=list.GetEnumerator()};while(an.E.MoveNext()){Debug.Write(an.E.Current);}}publicclassFoo{publicList.EnumeratorE{get;放;}}这里发生了什么?我测试了它,对我来说它也不适用于您的特定班级。原因是List.Enumerator是一个可变结构,而an.E是一个属性。编译器为每个自动属性生成一个支持字段,如下所示:publicclassFoo{privateList.Enumerator_E;publicList.Enumeratorget_E(){返回E;}publicvoidset_E(List.Enumeratorvalue){E=value;}}struct是一种值类型,因此每次访问an.E时都会得到该值的副本。当您调用MoveNext()或Current时,您会在该副本上调用它,并且该副本会发生变化。下次您访问an.E以调用MoveNext()或Current时,您将获得尚未迭代的枚举器的新副本。并且an.E.Current是0而不是1因为-再一次-你得到一个新的枚举器并且MoveNext()还没有被调用。如果要存储对列表枚举器的引用,可以声明一个类Foo,其属性类型为IEnumerator:publicclassFoo{publicIEnumeratorE{get;放;如果指定E=list.GetEnumerator();现在,枚举器被装箱并存储引用而不是值。以上是C#学习教程:枚举数行为会不会根据我们引用的方法发生变化?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
