Перечислитель как аргумент
-
10-12-2019 - |
Вопрос
Хорошо, давайте начнем с этой очень простой кнопки, нажмите Метод
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");
}
.
Этот метод ничего не делают, потому что каждое утверждение изящно проходит.Все в порядке, пока я не полагаю, я должен ввести метод для удаления избыточности
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");
}
.
Тем не менее, этот рефакторинг простын (для меня, по крайней мере).Это сломает программу! Во втором вызове до AssertNext, кажется, что перечислетель был уже сбрасывается в исходную точку и заставить утверждение потерпеть неудачу.
Я не могу понять, что происходит.Я действительно чувствую себя новичком с этой головоломкой.
Что я здесь скучаю?
Решение
Я воображаю, что это есть что связано с списком. Неуместный, являющийся структурой.Вы передаете его на метод, манипулируя его, а затем возвращаясь.Манипулирование, вероятно, не произошло для вашего исходного экземпляра.
Другие советы
List<T>.Enumerator
- это тип значения, означающий, что он скопирован в локальный объем вашего метода, измененный, а затем уничтожен при оказании способа.Попробуйте пройти через ссылку тоже.