
- •Структуры
- •Создание структуры
- •Пример создания и инициализации структуры:
- •class Demo
- •Переопределение функций
- •Пример:
- •class MainClass
- •Упаковка и распаковка
- •Обратный процесс извлечения значения из объекта называется
- •Пример упаковки
- •Для чего можно явно применять механизм упаковки – распаковки?
- •Обработка исключений
- •Класс System.Exception и его потомки
- •Методы обработки исключений
- •Выполнение программы происходит по следующему алгоритму:
- •Пример 1. Обработка явно предусмотренного исключения IndexOutOfRangeException – выход индекса за границы.
- •Последовательность перехвата исключений в цепочке методов
- •если обработка этого исключения предусмотрена в Met1,
- •Пример 2. Иллюстрация алгоритма - исключение будет генерироваться одним методом, а обрабатываться –
- •class Demo
- •Обработка повторяющихся исключений
- •Использование нескольких блоков catch
- •Перехват всех возможных исключений
- •Алгоритм обработки исключений :
- •using System;
- •catch (DivideByZeroException)
- •Генерирование исключений
- •Оператор throw используется также для повторной генерации исключений – после того, как соответствующее
- •class Demo
- •Блок finally
- •catch (DivideByZeroException)
- •Класс Exception
- •Пример 8. Иллюстрация использования методов и свойств класса Exception.
- •catch (IndexOutOfRangeException exc_obj)
- •Наследование классов исключений
- •class ClassDemo
- •catch (DivideByZeroException)
- •Перехват исключений наследующего класса
- •Пример 10. Создаются два класса исключений, затем в программе генерируются исключения обоих типов.
- •class ExceptB : ExceptA
- •catch (ExceptB exc_obj)
- •Операторы checked, unchecked
- •Первая форма оператора игнорирует переполнение для указанного выражения, а вторая – для блока

Структуры
Классы – ссылочные типы,
Структуры - подобные классу
пользовательские
типы – значения.
Отличия
структуры от класса:
не поддерживают наследования
(исключение - неявно наследуемый класс
System.Object),
у них нет деструкторов,
конструкторы реализованы особым образом.
1

Создание структуры
Переменная структурного типа создается с помощью специального оператора, с указанным конструктором:
struct_name var_name = new struct_name (param_list);
Допускается объявление структурной переменной:
struct_name var_name;
НО в этом случае
инициализация не выполняется,
не будет доступа к функциям-членам.
Поэтому следует явно присвоить начальные значения переменным-членам.
Для этого их надо объявить с уровнем доступа public.
2

Пример создания и инициализации структуры:
using System;
struct my_struct
{
public string name;
public int age;
// конструктор
public my_struct (string n, int a)
{
name = n;
age = a;
}
}
3

class Demo
{
public static void Main ( )
{
// вызов заданного конструктора
my_struct x1 = new my_struct ("Ivan", 19);
//вызов конструктора по умолчанию my_struct x2 = new my_struct ( );
//вызов конструктора отсутствует my_struct x3;
4

Console.WriteLine (x1.name + " " +x1.age);
if(x2.name == null) Console.WriteLine("x2.name
=null");
Console.WriteLine ("x2.age = " +x2.age);
// инициализация x3
x3.name = "Petr";
x3.age = 20;
Console.WriteLine (x3.name + " " +x3.age);
}
}
5

Переопределение функций
При работе со структурным типом есть единственный класс, методы которого можно переопределить
для конкретной структуры.
Это класс System.Object.
Часто переопределяют метод ToString,
приспосабливая для вывода полей структуры.
6

Пример:
using System;
public struct Point
{
public int x, y;
// конструктор
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
// переопределение метода ToString
public override string ToString()
{
return(String.Format("({0},{1})", x, y));
}
}
7

class MainClass
{
static void Main()
{
// инициализация
Point p1 = new Point();
Point p2 = new Point(10,15);
Console.WriteLine("точка #1 (конструктор по умолчанию): {0}", p1);
Console.WriteLine("точка #2 (заданный конструктор): {0}", p2);
}
}
8

Упаковка и распаковка
При необходимости C# автоматически выполняет упаковку (boxing):
преобразует тип – значение (в том числе и структуры) в ссылочный тип.
В частности, упаковка происходит при присваивании ссылочной переменной типа object значения обычного типа.
Такое присваивание допустимо, поскольку все типы наследуют тип object.
9

Обратный процесс извлечения значения из объекта называется
распаковкой (unboxing).
Для распаковки требуется применение операции приведения типа:
при выполнении присваивания обычной переменной значения,
упакованного в ссылочной,
перед ссылочной переменной надо в скобках указать
нужный тип – значение.
10