Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция15 Безопасность 2018.pptx
Скачиваний:
11
Добавлен:
08.12.2019
Размер:
351.87 Кб
Скачать

Структуры

Классы – ссылочные типы,

Структуры - подобные классу

пользовательские

типы – значения.

Отличия

структуры от класса:

не поддерживают наследования

(исключение - неявно наследуемый класс

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