- •1 Основные сведения о C#
- •1.1 Особенности языка
- •1.2 Типы данных
- •1.3 Переменные
- •1.4 Константы (литералы)
- •1.5 Операторы, используемые при построении выражений
- •1.6 Класс Object
- •1.7 Класс Math
- •1.8 Класс Convert
- •1.9 Пространство имен
- •1.10 Типы, допускающие значение null
- •2 Операторы и конструкции С#
- •2.1 Операторы присваивания
- •2.2 Приведение типов
- •2.3 Операторы инкремента и декремента
- •2.4 Операторные скобки {}
- •2.5 Условный оператор if
- •2.6 Логические операторы “И” и “ИЛИ”
- •2.7 Условный оператор ? :
- •2.8 Оператор выбора switch и оператор прерывания break
- •2.9 Оператор цикла for
- •2.10 Оператор цикла while
- •2.11 Оператор цикла do...while
- •2.12 Операторы прерываний break (для циклов) и continue
- •2.13 Оператор new
- •2.14 Массивы
- •2.14.1 Одномерные массивы
- •2.14.2 Многомерные массивы
- •2.14.3 Ступенчатые массивы
- •2.14.4 Работа с массивами как с объектами
- •2.15 Оператор цикла foreach
- •2.16 Строки
- •2.17 Перечисления
- •2.18 Обработка исключений
- •2.18.1 Класс Exception и стандартные исключения
- •2.18.2 Блок try...catch
- •2.18.3 Блок try...finally
- •2.18.4 Блок try...catch...finally
- •2.18.5 Оператор throw
- •3 Классы. Основные понятия
- •3.1 Общая схема
- •3.2 Спецификаторы доступа
- •3.3 Поля
- •3.4 Создание объекта и доступ к его членам
- •3.5 Методы
- •3.6 Перегрузка методов
- •3.7 Конструкторы
- •3.8 Деструкторы
- •3.9 Инициализаторы объектов
- •3.10 Свойства
- •3.11 Индексаторы
- •4 Классы. Расширенное использование
- •4.1 Статические классы и члены классов
- •4.2 Наследование
- •4.2.1 Наследование и конструкторы
- •4.2.2 Переопределение членов класса
- •4.3 Полиморфизм
- •4.3.1 Виртуальные методы
- •4.3.2 Абстрактные классы и члены классов
- •4.3.3 Операторы as и is
- •4.3.4 Модификатор sealed
- •5 Интерфейсы
- •6 Работа с файлами
- •6.1 Класс File
- •6.2 Работа с файлами как с потоками
- •6.2.1 Класс FileStream
- •6.2.2 Класс StreamReader
- •6.2.3 Класс StreamWriter
- •6.2.4 Класс BinaryReader
- •6.2.5 Класс BinaryWriter
int a; try
{
a = Convert.ToInt32(A_TB.Text);
}
catch (FormatException)
{
a = 1;
}
R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
catch (DivideByZeroException)
{
R_TB.Text = "Ошибка: деление на 0";
}
2.18.3 Блок try...finally
Блок try...finally применяется для создания фрагмента кода, который должен выполниться даже в том случае возникновения исключения. Формальная структура данного блока имеет вид:
try
{
<блок кода, проверяемый на ошибки>
}
finally
{
<обязательно выполняемый фрагмент кода>
}
Алгоритм работы блока try...finally следующий. При возникновении ошибки в блоке <блок кода, проверяемый на ошибки> дальнейшее выполнение данного блока прекращается и управление передаются блоку finally (т.е. вы-
полняется блок <обязательно выполняемый фрагмент кода>).
Если в блоке <блок кода, проверяемый на ошибки> не возникло оши-
бок, то управление передаются тому блоку finally.
Следует отметить, что возникающая ошибка останется необработанной, т.е. будет выдано стандартное сообщение о необработанной ошибке.
Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Результат вывести в компонент R_TB класса TextBox. Если число введено неправильно или равно 0, то считать его значение равным 1.
int a=1; try
{
42
a = Convert.ToInt32(A_TB.Text); if (a==0)
a = 1;
}
finally
{
R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
2.18.4 Блок try...catch...finally
Чтобы не оставалось необработанных ошибок при использовании блока try...finally, он, как правило, применяется в сочетании с блоком try...catch, путем добавления после него блока finally. При этом, в некоторых случаях блоки catch могут остаться пустыми.
Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Результат вывести в компонент R_TB класса TextBox. Если число введено неправильно или равно 0, то считать его значение равным 1.
int a=1; try
{
a = Convert.ToInt32(A_TB.Text); if (a==0)
a = 1;
}
catch (Exception)
{
}
finally
{
R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
2.18.5 Оператор throw
В приведенных выше примерах исключения генерировались программой автоматически. Однако в некоторых случаях бывает полезным сгенерировать исключение вручную. Формальное описание оператора генерации исключения имеет вид:
throw <объект класса исключения>;
Во многих случаях генерация исключения объединяется с созданием объекта, например:
43
throw new Exception("Неправильно введены данные");
Пример: найти результат целочисленного торое пользователь вводит в компоненте A_TB быть в диапазоне -100...100. Результат вывести в
деления числа 1000 на число a, кокласса TextBox. Число a должно компонент R_TB класса TextBox.
try
{
int a = Convert.ToInt32(A_TB.Text); if (a < -100 || a > 100)
throw new Exception("Число А должно быть в диапазоне -100...100"); R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
catch (FormatException)
{
R_TB.Text = "Ошибка: число А должно быть целым";
}
catch (DivideByZeroException)
{
R_TB.Text = "Ошибка: деление на 0";
}
catch (Exception E)
{
R_TB.Text = E.Message;
}
С помощью оператора throw можно повторно сгенерировать исключение после его обработки в блоке catch для того, чтобы оно также было обработано во внешнем блоке catch. Для этого во внутреннем блоке catch последним оператором указывается оператор throw без параметров.
Например, предыдущий пример может быть записан следующим образом:
try
{
int a=0; try
{
a = Convert.ToInt32(A_TB.Text); if (a < -100 || a > 100)
throw new Exception(
"Число А должно быть в диапазоне -100...100");
}
catch (FormatException)
{
MessageBox.Show("Ошибка: число А должно быть целым"); throw;
}
catch (Exception E)
{
MessageBox.Show(E.Message);
throw;
44
}
R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
catch (Exception)
{
R_TB.Text = "Результат не найден из-за неправильного ввода числа А";
}
45