- •Глава 10, описывающая классы как контейнеры их статических членов,
- •Глава 13 посвящена отношениям между классами (и их объектами). Особое
- •Глава 18 включена в книгу при подготовке второго издания. Она посвящен
- •Глава 1. Объектная ориентация программ
- •1.1. Типы, классы, объекты
- •1.2. Программа на c#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Глава 2. Типы в языке c#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов c#
- •2.3. Простые типы. Константы-литерал
- •2.4. Объявления переменных и констант базовых типо
- •If implicit in int interface
- •Internal is lock long namespace
- •Volatile while
- •Глава 3. Операции и целочисленные выражения
- •3.1. Операции языка c#
- •3.2. Операции присваивания и оператор
- •3.4. Выражения с арифметическими операциями
- •3.6. Переполнения при операциях с целыми
- •Глава 4. Выражения с операндами базовых
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •4.5. Тернарная (условная) операция
- •Глава 5. Типы с# как классы платформы .Net
- •5.1. Платформа .Net Framework и спецификация cts
- •5.2. Простые (базовые) типы c# как классы
- •5.3. Специфические методы и поля простых типов
- •Глава 6. Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.3. Условный оператор (ветвлений)
- •If (логическое выражение) оператор_1
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •If (условие) break;
- •6.6. Переключатель
- •Int ball; // оценка в баллах:
- •Глава 7. Массивы
- •7.1. Одномерные массивы
- •Int [ ] integers
- •Int number;
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •Int [,] dots;
- •Int size;
- •7.4. Массивы массивов и непрямоугольные массивы
- •Int size;
- •7.5. Массивы массивов и поверхностное копирование
- •Int size;
- •Int size;
- •Глава 8. Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •242.ToString()
- •8.3. Операции над строками
- •8.4. Некоторые методы и свойства класса String
- •8.5. Форматирование строк
- •8.6. Строка как контейне
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •Int static Compare (string, string)
- •Int static Compare (string, string, Boolean,CultureInfo)
- •If (string.Compare(res, hen, true,
- •8.9. Преобразования с участием строкового типа
- •38 Попугаев.
- •8.10. Аргументы метода Main( )
- •8.11. Неизменяемость объектов класса String
- •Глава 9. Методы c#
- •9.1. Методы–процедуры и методы-функции
- •9.2. Соотношение фиксированных параметров и аргументов
- •Int iPart;
- •9.3. Параметры с типами ссылок
- •Int[ ] temp;
- •Int[ ] temp;
- •9.4. Методы с переменным числом аргументов
- •VarParams(a, b, c);
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •4*Fact (3); {
- •9.7. Применение метода Array.Sort()
- •Int имя_функции(тип параметр_1, тип параметр_2)
- •If(условие 2) return -1; // порядок соблюдён
- •Глава 10. Класс как совокупность статических
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •Int X; // поле объектов класса
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Глава 11. Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •Int count; // текущее показание
- •1 ' Counter.Count' is inaccessible due to its protection leve
- •11.5. Ссылка this
- •Int numb;
- •11.6. Конструкторы объектов класса
- •Int p; // порядок - инициализация по умолчанию
- •Void reduce() // Приведение числа к каноническому виду.
- •11.7. Деструкторы и финализаторы
- •Глава 12. Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •Internal, private, static, virtual, sealed, override, abstract, extern
- •Internal protected
- •Int p; // инициализация по умолчанию
- •Void reduce() // "Внутренний" для класса метод
- •12.3. Автореализуемые свойств
- •12.4. Индексаторы
- •Int[] days; // часы по дням недели
- •Int search(string str) { // поиск слова
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Глава 13. Включение, вложение и наследование
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Глава 14. Интерфейсы
- •14.1. Два вида наследования в ооп
- •14.2. Объявления интерфейсов
- •Interface имя_интерфейса
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •14.3. Реализация интерфейсов
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •Interface iSeries {
- •Void setBegin(); // восстановить начальное состояние
- •Int GetNext { get; } // вернуть очередной член ряда
- •Int this[int k] {get;} // вернуть к-й член ряда
- •Interface iSeries // интерфейс числовых рядов
- •14.4. Интерфейс как ти
- •Interface iGeo { // интерфейс геометрической фигуры
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Interface iGeo {
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Ira.Transform(3);
- •Ira.Transform(3);
- •14.5. Интерфейсы и наследование
- •Interface iPublication // интерфейс публикаций
- •Interface iBase
- •Interface iBase {
- •Глава 15. Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •IsDe fined"
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •If (obj is Struct1)
- •If (ob is PointS)
- •If (ob is Double)
- •15.5. Реализация структурами интерфейсов
- •Interface iShape {
- •Interface iShape
- •Information(ci);
- •Information(sp);
- •Interface iImage {
- •Void display();
- •Interface iImage
- •Void display();
- •Глава 16. Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.4. Управление программой с помощью исключений
- •X; // Вводимое число.
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •If (!double.TryParse(input, out u))
- •If (!double.TryParse(input, out u)
- •16.7. Пользовательские классы исключений
- •Глава 17. Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •Int X, y; // положение робота на плоскости
- •17.3. Многоадресные (групповые) экземпляры делегатов
- •Virtual
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Int size; // размер массива
- •Int[ ] ar; // ссылка на массив
- •Int temp;
- •Глава 18. Обобщения
- •18.1. Обобщения как средство абстракции
- •18.2. Декларации обобщённых классов "декларация
- •18.3. Ограничения типизирующих параметров
- •Intemface iComparable {
- •Int CompareTo (object p);
- •18.4. Обобщённые структуры "обобщённые структуры"
- •18.5. Обобщённые интерфейсы "обобщённый интерфейс"
- •Int add(t X, t y); // прототип метода
- •18.6. Обобщённые методы "обобщённые методы"
- •18.7. Обобщённые делегаты "обобщённые делегаты"
- •Virtual
- •InnerException
- •Interface
6.5. Операторы передачи управления
Кроме оператора безусловного перехода (иначе – оператора безусловной
передачи управления goto) к операторам передачи управления относят: оператор
возврата из метода return; оператор выхода из цикла или переключателя break;
оператор перехода к следующей итерации цикла continue; оператор посылки
исключения throw.
Оператор return подробно рассмотрим, перейдя к методам (функциям).
Оператор throw требует хорошего понимания механизма генерации и обработки
исключений, поэтому знакомство с ним нужно отложить. Поэтому сейчас
остановимся на операторах break, continue и goto.
Оператор break
"оператор:оператор break"
служит для принудительного
выхода из цикла или переключателя. Определение "принудительный" подчеркивает
безусловность перехода. Например, в случае цикла не проверяются и не
рассматриваются условия дальнейшего продолжения итераций. Оператор break
прекращает выполнение оператора цикла или переключателя и осуществляет
передачу управления (переход) к следующему за циклом или переключателем
оператору. При этом в отличии от перехода с помощью goto оператор, к которому
выполняется передача управления, может быть не помечен. Оператор break нельзя
использовать нигде, кроме циклов и переключателей.
Необходимость в использовании оператора break в теле цикла возникает,
когда условия продолжения итераций нужно проверять не в начале итерации (циклы
for, while), не в конце итерации (цикл do), а в середине тела цикла. В этом случае
тело цикла может иметь такую структуру:
{ операторы
If (условие) break;
операторы
}
Например, если начальные значения целых переменных i, j таковы, что i < j, то
следующий цикл определяет наименьшее целое, не меньшее их среднего
арифметического:
while (i < j) { i++; if (i == j) break; j--; }
Для i == 0, j == 3 результат i == j == 2 достигается при выходе из цикла с
помощью оператора break. (Запись i == j == 2 не в тексте программы означает
равенство значений переменных i, j и константы 2.) Для i == 0 и j == 2 результат i
== j == 1 будет получен при естественном завершении цикла.
Как уже упомянуто, циклы могут быть многократно вложенными. Однако,
следует помнить, что оператор break позволяет выйти только из того цикла, в
котором он размещен. При многократном вложении циклов оператор break не может вызвать
передачу управления из самого внутреннего уровня непосредственно на самый внешний. Например, при
решении задачи поиска в матрице хотя бы одного элемента с заданным значением, когда цикл перебора
элементов строки вложен в цикл перебора строк, удобнее пользоваться не оператором break, а
оператором безусловной передачи управления goto.
В качестве примера, когда при вложении циклов целесообразно применение
оператора break, назовём задачу вычисления произведений элементов отдельных
строк матрицы. Задача требует вложения циклов. Во внешнем выбирается
очередная строка, во внутреннем – вычисляется произведение её элементов.
Вычисление произведения элементов строки можно прервать, если один из
сомножителей окажется равным 0. При появлении в строке нулевого элемент
а
оператор break прерывает выполнение только внутреннего цикла, однако внешний
цикл перебора строк выполнится для всех строк.
Оператор безусловного перехода
"оператор:оператор безусловного
перехода" , который мы рассмотрели в связи с метками и переключателем, имеет
вид:
goto идентификатор;
где идентификатор – имя метки оператора, расположенного в той же
функции, где используется оператор безусловного перехода.
Принятая в настоящее время дисциплина программирования рекомендует либо
вовсе отказаться от оператора goto, либо свести его применение к минимуму и
строго придерживаться следующих рекомендаций:
не входить внутрь блока извне (компилятор C# этого не позволит – сообщит об
ошибке);
не входить внутрь условного оператора, т.е. не передавать управление операторам,
размещенным после служебных слов if или else;
не входить извне внутрь переключателя (компилятор C# сообщит об ошибке);
не передавать управление внутрь цикла.
Следование перечисленным рекомендациям позволяет исключить возможные
нежелательные последствия бессистемного использования оператора безусловного
перехода. Полностью отказываться от оператора goto вряд ли стоит. Есть случаи,
когда этот оператор обеспечивает наиболее простые и понятные решения. Один из
них – это ситуация, когда нужно выйти из нескольких вложенных друг в друга
циклов или переключателей. Оператор break здесь не поможет, так как он
обеспечивает выход только из самого внутреннего вложенного цикла или
переключателя.
Оператор continue
"оператор:оператор continue" (оператор перехода к
следующей итерации) употребляется только в операторах цикла. С его помощью
завершается текущая итерация и начинается проверка условия возможности
дальнейшего продолжения цикла, т.е. условия начала следующей итерации. Для
объяснений действия оператора continue рекомендуется рассматривать операторы
цикла в следующем виде:
while (foo) { do { for (;foo;) {
... ... ...
contin: ; contin: ; contin: ;
} } while (foo); }
В каждой из форм многоточием обозначены операторы тела цикла. Вслед за
ними размещен пустой оператор с меткой contin. Если среди операторов тела цикла
есть оператор continue и он выполняется, то его действие эквивалентно оператор
у
безусловного перехода на метку contin.
Пример
использования
оператора
continue.
Вводя
с
клавиатуры
последовательность
вещественных
чисел
,
подсчитать
сумму
только
положительных. Окончанием ввода последовательности считать ввод нулевого
значения.
// 06_04.cs - оператор перехода к следующей итерации
using System;
class Program
{
static void Main() {
double sum = 0, x;
do { Console.Write("x = ");
x = Double.Parse(Console.ReadLine());
if (x < 0) continue;
sum += x;
}
while (x != 0);
Console.WriteLine("Сумма = "+sum);
}
}
Результат выполнения программы:
x = 2<ENTER>
x = -4<ENTER>
x = 6<ENTER>
x = 0<ENTER>
Сумма = 8
Напомним, что без обработки исключений применение метода Parse() делает
программу незащищённой от синтаксических ошибок во вводимых исходных
данных.
