我有以下问题:
我有一个列表并将字符串项目添加到该列表中。
然后我从列表中创建一个枚举器。当我用循环遍历列表时MoveNext()
当我直接访问枚举器时,它会起作用。当我使用枚举器属性访问枚举器时,它不起作用。这MoveNext()
命令不会增加索引。
这是我使用的代码。非常感谢你的帮助。
public class DummyKlasse
{
public List<string>.Enumerator enumerator;
public List<string> list;
public DummyKlasse()
{
Console.WriteLine("Test");
list = new List<string>();
enumerator = new List<string>.Enumerator();
}
public List<string>.Enumerator Enumerator
{
get { return enumerator; }
set { enumerator = value;}
}
public List<string> List
{
get { return list; }
set { list = new List<string>(value); }
}
public void dummyfunction()
{
List.Add("test1");
List.Add("test2");
enumerator = List.GetEnumerator();
}
}
public class Program
{
static void Main(string[] args)
{
DummyKlasse dummyklasse = new DummyKlasse();
dummyklasse.dummyfunction();
//Does not work with properties
/*
while (dummyklasse.Enumerator.MoveNext())
{
Console.WriteLine(dummyklasse.Enumerator.Current);
}
*/
//Works WITHOUT properties
while (dummyklasse.enumerator.MoveNext())
{
Console.WriteLine(dummyklasse.enumerator.Current);
}
Console.ReadLine();
}
}
List<T>.Enumerator http://msdn.microsoft.com/en-us/library/x854yt9s.aspx是一个结构体,所以在 while 循环中,每次访问Enumerator
属性,您正在调用 getter,它每次都会返回枚举器的新副本。该枚举器将指向列表开头之前的项目,并且每次调用MoveNext
and Current
将在该枚举器的不同副本上完成。
作为非空列表的结果,MoveNext
将始终返回 true,并且Enumerator.Current
始终为空。
如果直接访问该字段,则可以避免此副本以及通过调用来访问相同的枚举器MoveNext
and Current
.
如果您将代码更改为:
using (var enumerator = dummyklasse.Enumerator)
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
它会按预期工作。请注意,这类似于foreach
声明确实如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)