
- •4. Лекция: Операторы языка c#
- •Оператор присваивания
- •Семантика присваивания
- •Операции "упаковать" и "распаковать" - boxing и unboxing
- •Блок, или составной оператор
- •Пустой оператор
- •Операторы выбора
- •Оператор if
- •Оператор switch
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Операторы цикла
- •Оператор for
- •Циклы While
- •Цикл foreach
- •Специальные операторы
- •Оператор yield
- •Операторы try, catch, finally
- •Операторы checked и unchecked
- •Оператор fixed
- •Оператор lock
- •Проект Statements
- •Альтернатива и разбор случаев
- •Вычисление сумм, произведений и рекуррентные соотношения
- •Рекуррентные вычисления
- •Бесконечность и компьютеры. Вычисления с точностью ε
- •Проекты
-
Специальные операторы
Операторы языка C#, рассмотренные выше, имеют аналоги практически во всех языках программирования. Поговорим теперь о более экзотических операторах, не столь часто появляющихся в других языках программирования.
-
Оператор yield
При рассмотрении оператора цикла foreach говорилось, что он применим к классам, содержащим контейнеры с элементами, и цикл foreach перебирает элементы контейнера в некотором заданном порядке. Для того чтобы класс представлял контейнер, он должен быть перечислимым и быть наследником интерфейса IEnumerable. Есть другая возможность - класс может иметь один или несколько методов, называемых итераторами, создающих контейнеры и возвращающих результат интерфейсного класса IEnumerable.
Оператор yield используется в итераторах и позволяет заполнять контейнер элементами. Его синтаксис:
yield return <выражение>;
Каждое выполнение оператора yield добавляет новый элемент в контейнер. Подробно рассмотрение этого оператора будет дано в главе, посвященной интерфейсам. Сейчас же ограничусь одним примером. В класс Testing, используемый в нашем проекте, добавим итератор, создающий коллекцию:
/// <summary>
/// Итератор, создающий коллекцию цветов
/// </summary>
/// <returns>коллекцию </returns>
public System.Collections.IEnumerable Rainbow()
{
yield return "red";
yield return "orange";
yield return "yellow";
yield return "green";
yield return "blue";
yield return "violet";
}
Клиенты этого класса могут работать с этой коллекцией, например, так:
string colors = "";
foreach(string s in tst.Rainbow())
colors += s + "-";
Здесь tst - объект класса Testing, а переменная s в цикле foreach получит значения всех цветов, помещенных в контейнер оператором yield. Следует заметить, что реально никакие контейнеры не создаются, а цикл foreach на каждом шаге вызывает итератор и создает новый элемент. Именно поэтому цикл foreach работает только на чтение элементов и не работает на запись.
-
Операторы try, catch, finally
Об охраняемых блоках, блоках, перехватывающих исключения, задаваемых операторами try, catch, finally, мы уже говорили в лекции 2 и приводили достаточное число примеров. Тема организации обработки исключительных ситуаций и соответствующие операторы будут подробно рассматриваться в отдельной главе, а примеры их использования будут появляться повсеместно.
-
Операторы checked и unchecked
В лекции 3 рассматривались проверяемые и непроверяемые выражения и блоки. Блоки с предшествующими словами checked и unchecked и являются соответствующими операторами. Полагаю, что приведенных ранее сведений достаточно для понимания синтаксиса, семантики и области применения этих операторов.
-
Оператор fixed
Оператор fixed используется в небезопасных (unsafe) блоках, позволяя фиксировать в памяти расположение переменных, на которые ссылаются указатели. Такая фиксация не позволяет сборщику мусора перемещать зафиксированные переменные. Поскольку в данном курсе работа с указателями, прямая адресация и другие опасные средства, характерные для языка С++, не рассматриваются, то оператор fixed рассматриваться не будет и не будет встречаться в примерах этого курса.