000165. Цикл foreach для своих классов

Цикл foreach для своих классов||wmysterio|wmysterio|wmysterio@yandex.ru|/||

Всем привет! С вами, как обычно, wmysterio, и мы продолжаем изучать c#. В этом уроке мы постарается изучить одну интересную и не менее важную концепцию в c#. Как помочь классам подружиться с циклом foreach. Это обычно необходимо, когда класс имеет скрытое поле с массивом. При обращении к циклу, класс должен перебирать внутренний массив без необходимости получения его из вне.Чтобы узнать, что я имею ввиду, создадим несколько классов для примера. Первый класс будет иметь следующий вид:Кодpublic class ClassB { int _value; public ClassB( int value ) { _value = value; } public override string ToString() { return _value.ToString(); } }Класс ничего не делает, но он будет являться важным содержимым для следующего класса:Кодpublic class ClassA : IEnumerable { ClassB[] bList; public ClassA() { bList = new ClassB[3] { new ClassB(10), new ClassB(-5), new ClassB(0) }; } public IEnumerator GetEnumerator() { for ( int i = 0; i < bList.Length; i++ ) yield return bList[ i ]; } }Сразу в глаза попадаются два момента: реализация метода GetEnumerator() из интерфейса IEnumerable и использование нового для Вас оператора yield. Об интерфейсах я расскажу Вам немного позже. Оператор yield используется для возвращения по очереди каждого элемента. То есть - отдавать кусками. Не ждать прохождения всего цикла, а отдавать элемент цикла в foreach, так только итерация цикла foreach завершилась, идёт получение следующего куска из цикла for, где находится наш yield. Чтобы понять как это работает, давайте в приложении создадим класс ClassA и пройдёмся в цикле foreach и увидим результат:Кодclass Program { static void Main( string[] args ) { ClassA ca = new ClassA(); foreach ( ClassB item in ca ) Console.WriteLine( item ); Console.ReadKey(); } }Если Мы не знали что находится в классе ClassA, то нам и в голову не пришло бы, что с ним вообще возможный перебор через foreach. Обычно данный приём используется не для скрытия такой возможности, а для реализации этого класса в цикле foreach, и не только в нём. |912|1|0|42460690png108`113||cikl_foreach_dlja_svoikh_klassov|1423936483

Last updated