Pergunta

Ok, vamos começar com isto é muito simples, clique no botão de método

    private void button1_Click(object sender, EventArgs e)
    {
        int counter = 1;
        List<int> items = new int[] { 1, 2, 3 }.ToList();
        List<int>.Enumerator enm = items.GetEnumerator();

        // 1
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        // 2
        if (!enm.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        //3
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        if (enm.MoveNext()) 
            throw new Exception("Unexpected continuation of list");
    }

Este método não fazer nada porque, de cada afirmação graciosamente passar.As coisas estão bem, até que eu acredito que eu deveria apresentar um método para remover redundância

    static void AssertNext(ref int counter, List<int>.Enumerator e)
    {
        if (!e.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (e.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, e.Current));
        counter++;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var counter = 1;
        var items = new int[] { 1, 2, 3 }.ToList();
        var enm = items.GetEnumerator();
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        if (enm.MoveNext()) throw new Exception("Unexpected continuation of list");
    }

Embora, esta refatoração é simples (para mim, pelo menos).Não interromper o programa !Na segunda chamada para AssertNext, parece que o enumerador já foi redefinido para o ponto de partida e fazer com que a asserção de falha.

Eu não consigo entender o que aconteceu.Eu realmente sinto como um iniciante com este quebra-cabeça.

O que eu sinto falta aqui ?

Foi útil?

Solução

Eu estou imaginando, que tem algo a ver com a Lista.Mesmo sendo uma estrutura (struct).Você está passando a um método, manipulando-o, e então retornar.A manipulação, provavelmente, não teria acontecido para sua instância original.

Outras dicas

List<T>.Enumerator é um tipo de valor, o que significa que é copiado para o local do âmbito de aplicação do seu método, alterado e, em seguida, destruído após a saída do método.Tente passar por referência, também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top