Скачиваний:
3
Добавлен:
04.09.2023
Размер:
1.48 Mб
Скачать

Бывают случаи в программе, когда перед освобождением памяти,

выделенной под объект нужно выполнить какие-то действия. Деструктор, это метод который вызывается для гарантированного освобождения памяти под объект. В деструкторе указываются те действия, которые необходимо выполнить прежде чем уничтожить объект.

Общая форма деструктора имеет вид:

~имя_класса()

{

// код деструктора

}

где имя_класса – имя конкретного класса.

У деструктора отсутствует тип, который возвращается и список параметров.

В C# явно вызвать деструктор не получится, потому что на это нет специального оператора. Например, в языке C++ для этих целей используется оператор delete, который в языке C# не используется. Но в C++ не реализована система «сборки мусора».

Однако, деструктор автоматически вызывается системой «сборки мусора» перед уничтожением памяти под объект его класса.

Пример. В примере объявляется класс MyClass, в котором реализован деструктор ~MyClass().

// пример класса, в котором реализован деструктор class MyClass

{

int[] A; // внутренний массив A // конструктор класса

public MyClass()

{

// выделение памяти для массива A

A = new int[100];

}

// деструктор класса

~MyClass()

{

// действия, которые необходимо выполнить, если произойдет

"сборка мусора",

//и может быть вызван деструктор

//...

}

}

21 Полиморфизм и перегрузка операторов. Перегрузка унарных и

бинарных операторов. Семантика перегрузки операторов в С#.

Перегруженными наз-ся два и более метода с одинаковым именем,но с разл.списками аргументов.

Перегрузка.Часто бывает,что вып-ся одно и тоже действие(метод),но с разн. типами аргументов или их кол-вом.В нек.языках программ-я,чтобы решить дан.проблему приходилось описать все методы с новыми именами,в

С# для этого есть перегрузка. Перегрузка операторов тесно связана с перегрузкой методов. Для перегрузки операторов исп-ся ключ.слово operator,

позволяющее создать операторный метод,кот.опр-т действие оператора,связанное с его классом.Сущ-т 2 формы методов operator:

одна исп-ся для унарных операторов,а другая-для бинарных

Здесь эл-т орэто оператор(например "+" или "/"),кот.

перегружается.Эл-т тип_возврата-это тип зн-я, возвращ-го при вып-ии зад.операции.Несмотря на то, что можно выбрать любой тип,тип возвращ-го зн-я чаще всего будет совпадать с типом класса,для кот.этот оператор перегружается.Такая корреляция облегчает исп-е перегр. оператора в выр-

ях.Для унарных операторов операнд передается в эл-те операнд,а для бинарных-в эл-тах операнд1 и операнд2.Для унарных операторов тип операнда должен совпадать с классом,для кот.определен оператор.Что касается бинарных операторов, то тип хотя бы одного операнда должен совпадать с соответств-им классом.Таким образом,С#-операторы нельзя перегружать для классов, не созданных вами.Например,вы не можете перегрузить оператор "+" для типов int или string.

И последнее: параметры операторов не должны исп-ть модификатор ref

или out.

22 Понятие полиморфизма и шаблоны. Назначение и преимущества

использования шаблонов. Параметры универсального типа.

Полиморфизм просто означает способность использовать тип, не зная об этом. Вместо того, чтобы использовать конкретный тип, полиморфизм опирается на прототип какой-то формы, чтобы определить, какие типы он принимает. Любые типы, которые соответствуют этому прототипу,

принимаются.

Универсальные шаблоны позволяют точно настроить метод, класс,

структуру или интерфейс в соответствии с типом обрабатываемых данных.

Например, вместо использования класса Hashtable, который разрешает ключам и значениям иметь любой тип, можно использовать универсальный класс Dictionary<TKey,TValue> и указать типы, разрешенные для ключа и значения. Помимо прочего, преимуществами универсальных шаблонов являются улучшенная возможность многократного использования кода и сохранения типов.

Преимущества универсальных шаблонов

Использование универсальных коллекций и делегатов предоставляет целый ряд преимуществ.

1.Типобезопасность. Универсальные шаблоны позволяют передать компилятору обязанности обеспечения типовой безопасности. Нет необходимости написания кода для проверки правильности типа данных, так как проверка происходит во время компиляции. Уменьшается потребность приведения типов и вероятность ошибок во время выполнения.

2.Объем кода уменьшен и поддерживает многократную реализацию.

Нет необходимости наследования базового типа и преобладающих членов.

Например, LinkedList<T> готов к немедленному использованию.

3.Повышенная производительность. Универсальные типы коллекций имеют более высокую производительность при хранении и управлении типами значений, поскольку отсутствует необходимость их упаковки.

4.Универсальные делегаты поддерживают типобезопасные обратные вызовы без необходимости создания нескольких классов делегатов.

Например, универсальный делегат Predicate<T> позволяет создать метод,

который реализует собственные условия поиска для определенного типа, и

использовать ваш метод с методами типа Array , такими как Find, FindLastи FindAll.

5. Универсальные шаблоны упрощают динамически создаваемый код. Универсальные делегаты можно также использовать в динамически создаваемом коде без необходимости создания типа делегата. Это увеличивает количество ситуаций, в которых можно использовать облегченные динамические методы вместо создания целых сборок.

23 Свойства C# (Понятие инкапсуляции и свойства в C#.

Использование ключевых слов «get» и «set». Преимущества использования свойств.)

Инкапсуляция – свойство системы, позволяющее объединить данные и методы, работающие с ними в классе.

Объект и класс (набор программ изначально задумывался как одно целое) «синонимы».

При этом инкапсуляция означает, что класс должен защищать целостность данных, которые он инкапсулирует.

Инкапсуляция подразумевает сокрытие внутренней структуры данных и реализации методов объекта от остальной программы. При этом другим объектам доступен только интерфейс объекта, через который осуществляется все взаимодействие с ним.

Т. о. суть инкапсуляции - в быстрой и безопасной организации иерархической управляемости через сокрытие собственно реализации (чтобы было достаточно простой команды «что делать», без одновременного уточнения как именно делать).

Цель инкапсуляции – уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.

Существует 4 вида модификаторов доступа: public, protected, private и default.

Public – уровень предполагает доступ к компоненту с этим модификатором из экземпляра любого класса и любого пакета.

Protected – уровень предполагает доступ к компоненту с этим модификатором из экземпляров родного класса и классов-потомков,

независимо от того, в каком пакете они находятся.

Default – уровень предполагает доступ к компоненту с этим модификатором из экземпляров любых классов, находящихся в одном пакете с этим классом.

Private – уровень предполагает доступ к компоненту с этим модификатором только из этого класса.

Свойство – это специальное поле класса, содержащее программный код доступа к внутренним переменным (полям) класса или вычисления некоторого значения. Свойства обеспечивают удобный и рациональный путь доступа к внутренней переменной в классе.

Общая форма объявления свойства в классе: type PropName {

get {

//код для чтения внутреннего поля (переменной)

//...

}

set {

//код для записи значения во внутреннее поле (переменную)

//...

}

}

где

type – тип данных возвращаемый свойством;

PropName – имя свойства. По этому имени идет обращение к свойству;

get – аксессор, который используется для чтения значения из внутреннего поля класса;

set – аксессор, используемый для записи значения во внутреннее поле класса. Аксессор set получает неявный параметр value, содержащий значение, которое присваивается свойству.

Использование свойств в классах дает следующие преимущества:

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

в коде аксессоров можно реализовывать разного рода проверки на допустимость значений внутренних переменных класса;

гибкость в правах доступа к внутренней переменной: отсутствие аксесора set позволяет реализовать доступ «только для чтения» для внутренних данных класса. Это, в свою очередь, делает невозможным случайное изменение этих данных.

Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры

get и set.

Get – что-то берем

Set – что-то кладем

Class X

{

Public int x; // Определение класса - должны определить переменную доступную

другим классам

}

X1 = new X(); // Экземпляр класса int y;

y = X1*X или X1*X = 15 // В переменную “y“ записали значение X

Залезаем в class X и можем туда что-то записать Придумали get и set «дубляж» действия присваивания

class A

{

int x; // Переменная private по умолчанию

public int X // Метод, обеспечивающий доступ к х

{

get {return x; } // выдача наружу

set {x = value; } // присваивание величины

}

}

Внутренняя переменная – строчная буква Внешняя переменная – заглавная буква

Программа, использующая А

A1 = new A(); // создание экземпляра класса А

A1*X = 15 // вызов оператора set из Х и через нее попадем к внутренней переменной «х»

int y = A1*X // вызов оператора get для чтения «х»

Создали get и set для обращения к внутренним переменным.

Переменная year ϵ [1;6] по условию

class student

{

int year;

.

.

.

public int Year;

{

get {return year;} set {

if (value < 1) year = 1; // присваиваем ближайший. Нарушение области доп.знач

else if (value > 6) year = 6; // Нарушение области доп.знач. else year = value; }

}

Во внешней программе использование будет выглядеть:

Student St1 = new Student ()

St1.Year = 0; // Вызов set, проверка value и запись правильного значения

int a = St1.Year; // Вызов get

24 Механизм исключений (Назначение исключений. Основные

категории исключений. Ключевые слова try, catch и finally, throw.)

В ходе выполнения программы может возникнуть «аварийная» ситуация.

Исключения (Exceptions) — это тип ошибки, которая происходит при выполнении приложения. Ошибки обычно означают появление неожиданных проблем. Тогда как исключения, обработка которых организована в коде,

являются ожидаемыми, они происходят в коде приложений по различным причинам.

Исключения позволяют передать управление из одной части кода в другую часть.

Функции:

1.Гибкая реакция на аварийные ситуации

2.Выполнение некоторых завершающих действий

Базовым для всех типов исключений является тип Exception. Этот тип определяет ряд свойств, с помощью которых можно получить информацию об исключении.

Свойства класса Exception e имя свойства

1.Data (номер ошибки)

2.HelpLink (ссылка на подсказку)

3.InnerException (внутренние исключения – хранит информацию об исключении, которое послужило причиной текущего исключения)

4.Message – текст сообщения, соответствующий типу исключения

5.Source – имя сборки или объекта, где возникло исключение

6.Stack Track – последовательность выводов - возвращает строковое представление стека вызовов, которые привели к возникновению исключения

7.Target Site – возвращает метод, в котором и было вызвано исключение