Всем привет! С вами, как обычно, 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, и не только в нём.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Наш опрос
Что скажете о новом дизайне?
Всего ответов: 0
Активность на сайте
Друзья сайта
Статистика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
wmysterio
Сегодня нас посетили:
wmysterio