715.11K
Категория: ПрограммированиеПрограммирование

Операторы преобразования типов. Обработка исключений (лекция 7)

1.

Лекция 7.
Операторы преобразования
типов. Обработка исключений
Половикова О.Н.

2.

Операторы преобразования типов
(операторы приведения типов)
или операторы пользовательского преобразования типов
Если создали свой класс (новый тип данных, A)
можно задать (определить) неявное или явное
преобразование в другой тип (B) или из другого
типа в созданный нами тип:
A-->B;
B-->A
Примеры преобразований для базовых типов:
int a = (int)3.14; //явное
float f = 3.14f;
double d = f; //неявное

3.

Операторы преобразования типов
(операторы приведения типов)
Существуют две формы операторов преобразования: явная и
неявная:
public static explicit operator целевой_тип(исходный_тип v)
{return значение;}
public static implicit operator целевой_тип(исходный_тип v)
{return значение; }
где целевой_тип обозначает тот тип, в который выполняется
преобразование;
исходный_тип -- тот тип, который преобразуется;
Операторы преобразования возвращают данные, имеющие
целевой_тип, возвращать другой тип данных нельзя.

4.

Операторы преобразования
типов. Пример
Операторы явного преобразования для класса Matrix

5.

Операторы преобразования
типов. Пример
Операторы неявного преобразования для класса Matrix

6.

Операторы преобразования
типов. Пример ошибок

7.

Операторы преобразования типов
Для одних и тех же исходных и целевых типов данных нельзя
указывать оператор преобразования одновременно в явной и
неявной форме.
Неявные преобразования не требуют специального
синтаксиса для вызова и могут происходить в различных
ситуациях, например при присваивании.
Предопределенные неявные преобразования на C# всегда
завершаются успешно (для базовых типов) и никогда не
вызывают исключение или потерю данных.
Неявные пользовательские преобразования должны вести
себя таким же образом.
Если пользовательское преобразование может вызвать
исключение или привести к потере данных, определите его как
явное преобразование.

8.

Операторы преобразования типов.
Ограничения
1. Исходный или целевой тип
преобразования должен относиться к
классу, для которого объявлено данное
преобразование.
2. Для одних и тех же исходных и целевых типов
данных нельзя указывать одновременно явное и
неявное преобразование.
3. Нельзя указывать преобразование базового класса
в производный класс (наследование).

9.

Константы
Константа – некоторая постоянная величина, которая не должна
изменяться.
• Её нужно присвоить значение при определении;
• Это значение нельзя изменить.
• Доступ через название класса (как для статиеских полей)

10.

Поля для чтения
Полю для чтения можно присвоить значение при объявлении,
можно изменять в конструкторе (инициализировать или
изменять их значение в других местах нельзя)
• Поле для чтения объявляется с ключевым словом readonly.
• Поле для чтения можно только «читать».
Изменение
Чтение

11.

Константы и Поля для чтения
• Константы должны быть
проинициализированы в момент объявения, а
поля для чтения могут быть определены
(изменены) во время выполнения программы.
• Константы не могут использовать
модификатор static, так как уже неявно являются
статическими. Поля для чтения могут быть как
статическими, так и не статическими.

12.

Замечание
Свойства для чтения
Блоки set и get не обязательно одновременно должны присутствовать в
свойстве. Если свойство определяют только блок get, то такое
свойство доступно только для чтения - мы можем получить его
значение, но не установить. И, наоборот, если свойство имеет только
блок set, тогда это свойство доступно только для записи - можно только
установить значение, но нельзя получить.
Но, при этом можно явно прописать, что свойство доступно только для
чтения:
class A{

public readonly int Age{ get; } // указывать readonly необязательно
Можно объявить структуру только для чтения:
readonly struct B{ …}
В данной структуре все объявления полей и свойств должны
быть только для чтния.

13.

Обработка исключений. Обработка
ошибок
При выполнении программы возникают ошибки (либо так написан
программный код, либо невозможно предвидеть все ситуации).
Например, при выполнении вычислений используются переменные с nullзначениями. Язык C# предоставляет разработчикам возможности для
обработки таких ситуаций. Для этого в C# предназначена конструкция
try...catch...finally
• Вначале выполняются все инструкции в блоке try. Если в этом блоке не
возникло исключений (ошибок), то после его выполнения начинает
выполняться блок finally. И затем конструкция завершает свою работу.
• Если же в блоке try вдруг возникает исключение, то обычный порядок
выполнения останавливается, и среда начинает искать блок catch,
который может обработать данное исключение. Если нужный блок catch
найден, то он выполняется, и после его завершения выполняется блок
finally.
• Если нужный блок catch не найден, то при возникновении исключения
программа аварийно завершает свое выполнение.

14.

Пример. Обработка исключений
Корректный ввод
Некорректный ввод

15.

Обработка исключений
В рассматривемой конструкции (try...catch...finally) обязателельным блоком
является try.
• При наличии блока catch может не быть блока finally.
• При наличии блока finally может не быть блока catch (исключение не
обрабатываетя, хотя с точки зрения синтаксиса C# такая конструкция корректна).
В случае выполнения программного кода с ошибкой, если блока catch не будет в
конструкции, программа аварийно завершится.
Класс System. Exception
Для просмотра информации по ситуации, которая привела к ошибке (исключению),
можно использовать объект класса Exception, или его наследников.
В классе Exception объявлены разные свойства, которые позволяют детально
рассмотреть ситуацию, связанную с исключением, например:
Свойство
Описание
Message
Доступное только для чтения, возвращает текстовое описание
соответствующей ошибки. Само сообщение об ошибке может задаваться
в передаваемом конструктору параметре.
StackTrace Доступное только для чтения, содержит строку с описанием
последовательности вызовов (может быть полезно для отладки).

16.

Пример. Использования свойств
класса Exception
Создание ситуации, которая приводит к ошибке: Деление на нуль.
Вывод свойств для получения информации об ошибке.

17.

Наследники класса Exception
Класс Exception является базовым типом для всех исключений, поэтому
выражение catch (Exception ex) будет обрабатывать все исключения, которые
могут возникнуть.
Но также есть более специализированные типы исключений (классы
наследники), которые предназначены для обработки каких-то определенных
видов исключений, например:
DivideByZeroException: представляет исключение, которое генерируется при
делении на ноль
ArgumentOutOfRangeException: генерируется, если значение аргумента находится
вне диапазона допустимых значений
ArgumentException: генерируется, если в метод для параметра передается
некорректное значение
IndexOutOfRangeException: генерируется, если индекс элемента массива или
коллекции находится вне диапазона допустимых значений
InvalidCastException: генерируется при попытке произвести недопустимые
преобразования типов
NullReferenceException: генерируется при попытке обращения к объекту, который
равен null (то есть по сути неопределен)

18.

Пример. Создание объекта класса
DivideByZeroException

19.

Пример использования некольких
блоков catch
public static void Main(string[] args){
try{
// плохой код
}
catch (DivideByZeroException) {
Console.WriteLine("Возникло исключение: Деление на нуль”);
}
catch (IndexOutOfRangeException ex) {
Console.WriteLine("Выход ха пределы массива\n");
}
catch (Exception ex) {
Console.WriteнеLine(ex.Message);
}
Console.ReadKey(true);
}
Если использовать несколько блоков, в этому случае, при возникновении
исключительной ситуации будет отработан блок, который ей соответствует
либо общий блок: catch (Exception ex).

20.

Несколько блоков catch

21.

Обработка ошибок ввода
Ряд исключительных ситуаций являются вполне прогнозируемыми - к ним относятся
стандартные ситуации, связанные с вводом данным. Когда программа ожидает целое
цисло, а получает строку. Образовалось даже устоявшееся выражение «Защита от
некорректного ввода».
Для обработки таких ситуаций можно также использовать блок
try{…}
catch (Exception ex){…},
Но, гораздо оптимальнее, проверить допустимость преобразования при вводе значений.
Например,
Console.WriteLine("Введите целое число");
int x;
if (Int32.TryParse(Console.ReadLine(), out x)) {
try{
Console.WriteLine("Результат: {0:F2}", 1.0/x);
}
catch {
Console.WriteLine(«Некорректные данные");
}
}
else {
Console.WriteLine("Не целочисленный параметр");
}

22.

Обработка ошибок ввода
Метод Int32.TryParse() возвращает true, если преобразование можно
осуществить, и false - если нельзя.
При допустимости преобразования переменная x будет содержать
введенное число. Так, не спользуя try...catch можно обработать
возможную исключительную ситуацию.
Можно использовать и другие подобные методы для всех базовых
типов:
double.TryParse();
byte.TryParse();
float.TryParse();
int.TryParse();
short.TryParse();
English     Русский Правила