Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有属性的c列表和枚举数_C#_List_Properties_Enumeration - Fatal编程技术网

C# 具有属性的c列表和枚举数

C# 具有属性的c列表和枚举数,c#,list,properties,enumeration,C#,List,Properties,Enumeration,我有以下问题: 我有一个列表,并将字符串项添加到此列表中。 然后从列表中创建一个枚举器。当我使用MoveNext命令在列表中循环时,当我直接访问枚举器时,它就会工作。当我使用枚举器属性访问枚举器时,它不起作用。MoveNext命令不会增加索引 这是我使用的代码。非常感谢你的帮助 public class DummyKlasse { public List<string>.Enumerator enumerator; public List<string>

我有以下问题: 我有一个列表,并将字符串项添加到此列表中。 然后从列表中创建一个枚举器。当我使用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();
    }
}
是一个结构,因此在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-如果直接访问字段,则不会复制它。出于某种原因,我仍然认为它是一个变量,尽管我知道它是一个值。结构可能很棘手。非常感谢。我不知道它会复制结构。