Операторы преобразования типов. Обработка исключений (лекция 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

Операторы преобразования типов. Ограничения

Исходный или целевой тип преобразования должен относиться к классу, для

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

Слайд 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 объявлены разные свойства, которые позволяют детально рассмотреть ситуацию, связанную с исключением, например:

Слайд 16

Пример. Использования свойств класса Exception

Создание ситуации, которая приводит к ошибке: Деление на

нуль.
Вывод свойств для получения информации об ошибке.

Слайд 17

Наследники класса Exception

Класс Exception является базовым типом для всех исключений, поэтому выражение catch (Exception

ex) будет обрабатывать все исключения, которые могут возникнуть.
Но также есть более специализированные типы исключений (классы наследники), которые предназначены для обработки каких-то определенных видов исключений, например:

Слайд 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("Не целочисленный параметр");
}

Имя файла: Операторы-преобразования-типов.-Обработка-исключений-(лекция-7).pptx
Количество просмотров: 5
Количество скачиваний: 0