
- •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.5.1 Перегрузка методов
- •3.5.2 Новое в версии C# 4.0
- •3.6 Конструкторы
- •3.7 Деструкторы
- •3.8 Инициализаторы объектов
- •3.9 Свойства
- •3.10 Индексаторы
- •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
- •4.4 Перегрузка операторов
- •5 Интерфейсы
- •6 Делегаты, лямбда-выражения и события
- •6.1 Делегаты
- •6.2 Анонимные методы и лямбда-выражения
- •6.3 События
- •7 Универсальные типы
- •7.1 Общая схема
- •7.2 Ограничения по параметрам типа
- •7.2.1 Ограничение на базовый класс
- •7.2.2 Ограничение на интерфейс
- •7.2.3 Ограничение на конструктор
- •7.2.4 Ограничения ссылочного типа и типа значения
- •7.3 Параметры типы в методах
- •7.4 Некоторые универсальные типы С#
- •7.4.1 Класс Array
- •7.4.2 Класс List<T>
- •7.4.3 Класс LinkedList<T>
- •7.4.4 Класс Queue<T>
- •7.4.5 Класс Stack<T>
- •7.4.6 Классы SortedSet<T> и HashSet<T>
- •7.4.7 Классы Dictionary<TKey, TValue> и SortedDictionary<TKey, TValue>
- •8 Работа с файлами
- •8.1 Класс File
- •8.2 Работа с файлами как с потоками
- •8.2.1 Класс FileStream
- •8.2.2 Класс StreamReader
- •8.2.3 Класс StreamWriter
- •8.2.4 Класс BinaryReader
- •8.2.5 Класс BinaryWriter
- •9 LINQ
- •9.1 Программные конструкции и типы, используемые LINQ
- •9.1.1 Методы расширения
- •9.1.2 Анонимные типы
- •9.1.3 Интерфейс IEnumerable<T>
- •9.2 Построение запросов на LINQ
- •9.2.1 Общая структура запроса
- •9.2.2 Простой запрос
- •9.2.3 where : использование условий отбора
- •9.2.4 orderby : использование сортировки
- •9.2.5 select : определение возвращаемого значения
- •9.2.1 group : группировка данных
- •9.2.1 into : обработка результатов группировки
- •9.2.1 let : временные переменные в запросе
- •9.2.2 from : использование нескольких источников данных
- •9.2.3 join : соединение данных из нескольких источников
- •9.3 Получение результатов с использованием методов
- •9.3.1 Метод Where
- •9.3.2 Метод Select
- •9.3.3 Методы сортировки
- •9.3.4 Метод GroupBy
- •9.3.5 Метод Join
- •9.3.6 Дополнительные методы интерфейса IEnumerable<T>
- •9.4 Совместное использование запросов и методов
try
{
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";
}
В блоке catch может не указываться тип исключения. В этом случае такой блок располагается самым последним и обрабатывает все типы исключений, не обработанные до него.
2.18.3 Блок try...finally
Блок try...finally применяется для создания фрагмента кода, который должен выполниться даже в том случае возникновения исключения. Формальная структура данного блока имеет вид:
try
{
<блок кода, проверяемый на ошибки>
}
finally
{
<обязательно выполняемый фрагмент кода>
}
Алгоритм работы блока try...finally следующий. При возникновении ошибки в блоке <блок кода, проверяемый на ошибки> дальнейшее выполнение данного блока прекращается и управление передаются блоку finally (т.е. вы-
полняется блок <обязательно выполняемый фрагмент кода>).
Если в блоке <блок кода, проверяемый на ошибки> не возникло оши-
бок, то управление передаётся блоку finally.
Следует отметить, что возникающая ошибка останется необработанной, т.е. будет выдано стандартное сообщение о необработанной ошибке.
Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Результат вывести в
43
компонент R_TB класса TextBox. Если число введено неправильно или равно 0, то считать его значение равным 1.
int a=1; try
{
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);
}
44
2.18.5 Оператор throw
В приведённых выше примерах исключения генерировались программой автоматически. Однако в некоторых случаях бывает полезным сгенерировать исключение вручную. Формальное описание оператора генерации исключения имеет вид:
throw <объект класса исключения>;
Во многих случаях генерация исключения объединяется с созданием объекта, например:
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);
45
if (a < -100 || a > 100) throw new Exception(
"Число А должно быть в диапазоне -100...100");
}
catch (FormatException)
{
MessageBox.Show("Ошибка: число А должно быть целым"); throw;
}
catch (Exception E)
{
MessageBox.Show(E.Message);
throw;
}
R_TB.Text = String.Format(
"Результат выражения 1000/{0} равен {1}", a, 1000/a);
}
catch (Exception)
{
R_TB.Text = "Результат не найден из-за неправильного ввода числа А";
}
46