В C# существует два ключевых подхода к исполнению кода: управляемый (managed) и неуправляемый (unmanaged). Эти понятия определяют, как программа взаимодействует с операционной системой, управляет памятью и обрабатывает ошибки.
Управляемый код (Managed Code)
Это код, который выполняется под управлением Common Language Runtime (CLR) — среды выполнения .NET. CLR управляет памятью, обработкой исключений, безопасностью и другими важными аспектами.
Признаки управляемого кода:
- Выполняется в среде CLR
- Поддерживает сборку мусора (Garbage Collection).
- Имеет доступ к .NET-библиотекам
- Обеспечивает безопасность типов
Пример управляемого кода:
class Program
{
static void Main()
{
Console.WriteLine("Это управляемый код");
}
}
Здесь весь код работает внутри CLR, и .NET управляет памятью автоматически.
Неуправляемый код (Unmanaged Code)
Это код, который напрямую взаимодействует с операционной системой, аппаратным обеспечением или использует внешние библиотеки (например, на C/C++).
Признаки неуправляемого кода:
- Требует ручного управления памятью (например,
malloc/free
в C/C++) - Может напрямую работать с системными API
- Может вызывать код на других языках (например, через P/Invoke)
Пример вызова неуправляемого кода в C#:
public class HelloWorld {
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr MessageBox(int hWnd, String text, String caption, uint type);
public static void Main() {
MessageBox(0, "Hello, world!", "Unmanaged Code", 0);
}
}
Здесь MessageBox
— это функция из Windows API (неуправляемый код), а DllImport
позволяет вызывать её из C#.