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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00300/00100/000165.-cikl-foreach-dlya-svoikh-klassov.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
