Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

7.6.3. Операції перетворення типу

Операції перетворення типу забезпечують можливість явного і неявного перетворення між призначеними для користувача типами даних. Синтаксис об’явника операції перетворення типу:

implicit operator тип (параметр ) // неявне перетворення

explicit operator тип (параметр ) // явне перетворення

Ці операції виконують перетворення з типу параметра в тип, вказаний в заголовку операції. Одним з цих типів має бути клас, для якого визначається операція. Таким чином, операції виконують перетворення або типу класу до іншого типу, або навпаки. Перетворювані типи не мають бути зв'язані стосунками спадкоємства. Приклади операцій перетворення типу для класу Monster:

public static implicit operator int( Monster m )

{

return m.health;

}

public static explicit operator Monster(int h )

{

return new Monster(h, 100, "FromInt");

}

Нижче приведені приклади використання цих перетворень в програмі. Не треба шукати в них сенс, вони просто ілюструють синтаксис:

Monster Masha = new Monster(200, 200, "Masha");

int i = Masha; //неявне перетворення

Masha = (Monster) 500; //явне перетворення

Неявне перетворення виконується автоматично:

  • при привласненні об'єкту змінній цільового типу, як в прикладі;

  • при використанні об'єкту у виразі, що містить змінні цільового типу;

  • при передачі об'єкту в метод на місце параметра цільового типу;

  • при явному приведенні типу.

Явне перетворення виконується при використанні операції приведення типу. Всі операції класу повинні мати різні сигнатури. Ключові слова implicit і explicit в сигнатуру не включаються, отже, для одного і того ж перетворення не можна визначити одночасно явну і неявну версії.

Неявне перетворення слід визначати так, щоб при його виконанні не виникала втрата точності і не генерувалися виключення. Якщо ці ситуації можливі, перетворення слід описати як явне.

7.7. Деструктор

У С# існує спеціальний вид методу, який називається деструктором. Він викликається складальником сміття безпосередньо перед видаленням об'єкту з пам'яті. У деструкторі описуються дії, що гарантують коректність подальшого видалення об'єкту, наприклад, перевіряється, чи всі ресурси, використовувані об'єктом, звільнені (файли закриті, видалене з'єднання розірване і т. п.).

Синтаксис деструктору:

[атрибути] [extern] ~ ім'я_класу( )

тіло

Як видно з визначення, деструктор не має параметрів, не повертає значення і не вимагає вказівки специфікаторів доступу. Його ім'я збігається з ім'ям класу і перед ним ставиться тильда (~), виконує зворотні по відношенню до конструктора дії. Тілом деструктору є блок або просто крапка з комою, якщо деструктор визначений як зовнішній (extern).

Складальник сміття видаляє об'єкти, на які немає посилань. Він працює відповідно до своєї внутрішньої стратегії в невідомі для програміста моменти часу. Оскільки деструктор викликається складальником сміття, неможливо гарантувати, що деструктор буде обов'язково викликаний в процесі роботи програми. Отже, його краще використовувати тільки для гарантії звільнення ресурсів, а “штатне” звільнення виконувати у іншому місці програми.

Застосування деструкторів уповільнює процес збірки сміття.