Однією з основних переваг мови С# є його схема роботи з пам'яттю: автоматичне виділення пам'яті під об'єкти і автоматичне прибирання сміття. При цьому неможливо звернутися за неіснуючою адресою пам'яті або вийти за межі масиву, що робить програми надійнішими і безпечнішими і унеможливлює появи цілого класу помилок.
Проте в деяких випадках виникає необхідність працювати з адресами пам'яті безпосередньо, наприклад, при взаємодії з операційною системою, написанні драйверів або програм, час виконання яких критично. Таку можливість надає так званий небезпечний (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).