C# 具有属性的c列表和枚举数
我有以下问题: 我有一个列表,并将字符串项添加到此列表中。 然后从列表中创建一个枚举器。当我使用MoveNext命令在列表中循环时,当我直接访问枚举器时,它就会工作。当我使用枚举器属性访问枚举器时,它不起作用。MoveNext命令不会增加索引 这是我使用的代码。非常感谢你的帮助C# 具有属性的c列表和枚举数,c#,list,properties,enumeration,C#,List,Properties,Enumeration,我有以下问题: 我有一个列表,并将字符串项添加到此列表中。 然后从列表中创建一个枚举器。当我使用MoveNext命令在列表中循环时,当我直接访问枚举器时,它就会工作。当我使用枚举器属性访问枚举器时,它不起作用。MoveNext命令不会增加索引 这是我使用的代码。非常感谢你的帮助 public class DummyKlasse { public List<string>.Enumerator enumerator; public List<string>
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();
}
}
是一个结构,因此在while循环中,每次访问枚举器属性时,都会调用getter,每次都会返回枚举器的新副本。此枚举数将指向列表开头之前的项,对MoveNext和Current的每次调用都将在该枚举数的不同副本上完成
作为非空列表的结果,MoveNext将始终返回true,Enumerator.Current始终为null
如果直接访问该字段,则避免调用MoveNext和Current访问此副本和相同的枚举数
如果您将代码更改为:
using (var enumerator = dummyklasse.Enumerator)
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
它将按预期工作。注意,这与foreach语句的作用类似。是一个结构,因此在while循环中,每次访问枚举器属性时,都调用getter,每次都会返回枚举器的新副本。此枚举数将指向列表开头之前的项,对MoveNext和Current的每次调用都将在该枚举数的不同副本上完成
作为非空列表的结果,MoveNext将始终返回true,Enumerator.Current始终为null
如果直接访问该字段,则避免调用MoveNext和Current访问此副本和相同的枚举数
如果您将代码更改为:
using (var enumerator = dummyklasse.Enumerator)
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
它将按预期工作。注意,这与foreach语句的作用类似。为什么要在DummyKlasse中捕获枚举数?最好只捕获您正在做的列表本身,让消费者担心他们自己的枚举器。这最好通过使用foreach循环来实现
你为什么要在你的DummyKlasse中捕获一个枚举器?最好只捕获您正在做的列表本身,让消费者担心他们自己的枚举器。这最好通过使用foreach循环来实现
你的目标到底是什么?大多数情况下,一个简单的foreach构造将允许您迭代数据?大多数情况下,一个简单的foreach构造将允许您迭代您的数据。使用继承addedh回答这是如何解决直接访问OP示例中的字段有效但属性无效这一事实的?@mao47-如果您直接访问字段,你没有复制它。出于某种原因,我仍然认为它是一个变量,尽管我知道它是一个值。结构可能很棘手。非常感谢。我不知道它会复制结构。这如何解决直接访问OP示例中的字段有效但属性无效的问题?@mao47-如果直接访问字段,则不会复制它。出于某种原因,我仍然认为它是一个变量,尽管我知道它是一个值。结构可能很棘手。非常感谢。我不知道它会复制结构。