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

Розділ 14. Додаткові засоби с#

У цьому розділі описані додаткові засоби мови С# і середовища Visual Studio: вказівки, регулярні вирази і документація у форматі XML. В кінці розділу дається коротке введення в основні сфери професійного застосування С#: ASP.NET (веб - форми і веб - служби) і ADO.NET (бази даних).

Вказівки, без яких не мислять своє життя програмісти, що використовують С і С+ +, у мові С# рекомендується застосовувати тільки у разі потреби, оскільки вони зводять нанівець багато переваг цієї мови. Документування коди у форматі XML і регулярні вирази застосовуються ширше, але відносяться до додаткових можливостей мови, тому не були розглянуті раніше.

Веб - форми, веб - служби і робота з базами даних є одними з основних сфер застосування С#, але не розглядаються через те, що подібні теми не входять в базовий курс програмування.

14.1. Небезпечний код

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

Проте в деяких випадках виникає необхідність працювати з адресами пам'яті безпосередньо, наприклад, при взаємодії з операційною системою, написанні драйверів або програм, час виконання яких критично. Таку можливість надає так званий небезпечний (unsafe) код.

Небезпечним називається код, виконання якого середовище CLR не контролює. Він працює безпосередньо з адресами областей пам'яті за допомогою вказівок і має бути явним чином помічений за допомогою ключового слова unsafe, яке визначає так званий небезпечний контекст виконання.

Ключове слово unsafe може використовуватись або як спецификатор, або як оператор. У першому випадку його указують разом з іншими специфікаторами при описі класу, делегата, структури, методу, поля і так далі - скрізь, де допустимі інші специфікатори. Наприклад:

public unsafe struct Node

{

public int Value; .

public Node* Left;

public Node* Right;

}

Вся структура Node позначається як небезпечна, що робить можливим використання в ній вказівок Left і Right. Можна застосувати і інший варіант опису, в якому небезпечними оголошуються тільки відповідні поля структури:

public struct Node

{

public int Value;

public unsafe Node* Left;

public unsafe Node* Right;

}

Оператор unsafe має наступний синтаксис:

Unsafe блок

Всі оператори, що входять в блок, виконуються в небезпечному контексті.

Компіляція кода, що містить небезпечні фрагменти, повинна проводитися з ключем /unsafe. Цей режим можна встановити шляхом налаштування середовища Visual Studio (Project ► Properties ► Configuration Properties ► Build ► Allow Unsafe Code).

14.1.1. Синтаксис вказівок

Вказівки призначені для зберігання адреси областей пам'яті. Синтаксис оголошення вказівок:

тип* змінна;

Тут тип - це тип величини, на яку указує змінна, тобто величини, що зберігається за записаною в змінній адресою. Тип не може бути класом, але може бути структурою, переліченням, вказівкою, а також одним із стандартних типів: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool і void. Останнє означає, що вказівка посилається на змінну невідомого типу. Вказівка на тип void застосовується в тих випадках, коли конкретний тип об'єкту, адресу якого потрібно зберігати, не визначений (наприклад, якщо в одній і тій же змінній в різні моменти часу потрібно зберігати адреси об'єктів різних типів). Вказівці на тип void можна привласнити значення вказівки будь-якого типу, а також порівнювати його з будь-якими вказівками, але перед виконанням яких-небудь дій з областю пам'яті, на яку вона посилається, потрібно перетворити його до конкретного типу явним чином. Приклади оголошення вказівок:

int* а; // вказівка на int

Node* pNode; // вказівка на описану раніше структуру Node

void* р; // вказівка на невизначений тип

int*[] m; // одновимірний масив вказівок на int

int** d; // вказівка на вказівку на int

У одному операторові можна описати декілька вказівок одного і того ж типу, наприклад:

int* а, b, с; // три вказівки на int

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