Это очень простой (и бессмысленный) пример типа var, который имеет свойства перечислителя. Точка фрагмента состоит в том, чтобы поэкспериментировать с коллекцией с использованием строго типизированного класса, который реализует интерфейс IEnumerator
.При использовании IEnumerator на строго типизированном классе он совершает много поездок на сервер
public class num { public int value { get; set; } }
class Program {
private int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
static void Main(string[] args) {
Program p = new Program();
var numbers = selectNumbers(p.data);
foreach(num x in numbers) {
Console.WriteLine("Found {0}", x.value.ToString());
}
Console.WriteLine("press [enter] to exit");
Console.Read();
}
static IEnumerable<num> selectNumbers(int[] x) {
//in production app the following would use a reader to get data from database
for(int i = 0; i < x.Length; i++) {
yield return new num { value = x[i] };
Console.WriteLine("Found {0}", x[i].ToString()); // <<<(1)
}
}
}
Результаты, возвращенные на консоль, немного странные. Результаты, по-видимому, предполагают, что каждый раз, когда выполняется итерация цикла foreach
, выполняется строка (1).
Означает ли это, что если бы я применил эту структуру к приложению настройки базы данных, где selectNumbers
участвовал в получении контакта с нашей базой данных, будет ли он делать соединение каждый раз, когда используется IEnumerator? например каждый раз, когда он использует цикл foreach
на строго типизированном num
, будет ли он связываться с нашей базой данных? Результаты этого примера, похоже, предполагают, что это произойдет.
['yield return'] (http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx) вернет управление обратно вызывающему абоненту до тех пор, пока он не будет вызван или не будет исчерпан вернуться. – Romoku