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|42460690png
108`113||cikl_foreach_dlja_svoikh_klassov|1423936483
Last updated