Что такое C#?
C# был разработан эксклюзивно для платформы Microsoft .NET Framework, произносится как «Си Шарп».
Microsoft нуждалась в едином полностью объектно-ориентированном среде разработки, чтобы устранить недостатки старых технологий. Компания начала создавать новую среду выполнения кода вместе с полным набором инструментов разработчика.
За более чем 20 лет развития C# превратился из языка только для Windows в кроссплатформенный инструмент, поддерживающий множество операционных систем.
Сегодня C# вместе с .NET образуют готовое кроссплатформенное решение: на нем создают приложения для Windows, macOS, Linux и Android. Также это предпочитаемая среда выполнения для большинства облачных систем.
Благодаря активной поддержке Microsoft обновления C# выходят очень часто. Версия 7 вышла в 2022 году. Язык сохраняет совместимость с кодом, написанным 20 лет назад, а новые редакции предлагают более лаконичный, элегантный синтаксис и компактные структуры. В 2026 году актуальна 15-я версия.
Краткая история версий C# (выдержка)
- C# 1.0 (2001): официальный публичный релиз
- C# 2.0 (VS2005): дженерики, итераторы, анонимные методы
- C# 3.0 (VS2008): методы расширения, лямбда-выражения, LINQ (языковые запросы)
- C# 4.0 (2010): именованные/опциональные параметры, динамический тип dynamic, библиотека параллельных задач TPL для полного использования многоядерных процессоров
- C# 5.0: нативная поддержка асинхронных задач через async/await
- C# 6.0: интерполяция строк, члены с телом выражения, упрощенный синтаксис свойств
- C# 7.0~7.3: множественные возвращаемые значения через кортежи, упрощение параметров out, сопоставление по шаблону, асинхронный метод Main
- C# 8.0/9.0/10.0: записи (неизменяемые ссылочные типы), инструкции верхнего уровня (без обязательного Main), стандартные методы интерфейсов, статические локальные функции, асинхронные высвобождаемые типы, глобальное сопоставление по шаблону по всему языку
- C#11 (.NET7): сырые строки, обобщенная математика, свойства required
- C#12 (.NET8): основные конструкторы, сокращенный синтаксис коллекций, встроенные массивы
- C#13 (.NET9): частичные свойства, индексаторы расширения, локальные переменные ref в итераторах
- C#14 (.NET10): обобщенные псевдонимы, глубокое сопоставление коллекций, синтаксический сахар SIMD
Windows остается основной платформой для C#, но благодаря .NET Runtime код запускается напрямую на системах вроде Linux. Это позволяет написать один код и развернуть его на нескольких операционных системах.
Платформа .NET Framework
Первый релиз .NET Framework состоялся в 2002 году.
.NET Framework устраняет ограничения старых поколений инструментов разработки, его основные преимущества:
- Поддержка множества устройств: работает на серверах, компьютерах, КПК, мобильных телефонах и другом оборудовании;
- Соответствие промышленным стандартам: нативная поддержка универсальных протоколов связи XML, HTTP, SOAP, JSON, WSDL;
- Песочница безопасности: обеспечивает изоляцию для безопасного выполнения кода из ненадежных источников.
Три ключевых компонента .NET Framework
- CLR Common Language Runtime (среда выполнения) управляет всем жизненным циклом программ: управление памятью и сборка мусора, проверка безопасности кода, планирование потоков, обработка исключений.
- Набор инструментов разработки интегрированные среды разработки, мультиязычные компиляторы .NET (C#/VB.NET/F# и другие), отладчики и веб-бэкенд технологии ASP.NET/WCF.
- BCL Базовая библиотека классов (также FCL Framework Class Library) содержит огромный набор готовых универсальных классов, которые разработчик может вызывать напрямую.
Улучшения .NET по сравнению с классической разработкой под Windows
Единая объектно-ориентированная модель
CLR, BCL и C# тесно интегрированы и предоставляют единую ООП-модель. Десктопные, мобильные, веб и распределенные приложения используют одинаковую парадигму разработки, синтаксис и логика согласованы на любом устройстве.
Автоматическая сборка мусора GC
В CLR встроен сборщик мусора, который автоматически освобождает память от неиспользуемых объектов. Разработчику не нужно вручную управлять памятью или искать утечки памяти, это значительно снижает нагрузку на поддержку.
Многомерная интероперабельность
- Взаимодействие между языками .NET: классы, написанные на разных языках .NET, могут вызывать и наследовать друг друга; платформа не привязана к одному языку программирования;
- Вызов платформы P/Invoke: прямой вызов нативных интерфейсов DLL Win32 на языке C;
- Совместимость с COM: компоненты .NET и старые COM-компоненты вызываются в обе стороны.
Упрощенное развертывание: нет зависимости от реестра Windows; в минимальных сценариях достаточно скопировать файлы для запуска программы;
Параллельные сборки: на одном устройстве могут сосуществовать разные версии одной DLL. Каждая программа привязывается к той версии библиотеки, с которой была скомпилирована — конфликты версий DLL устранены.
Проверка типовой безопасности CLR (Common Language Runtime) принудительно проверяет параметры и типы данных. Даже при взаимодействии компонентов разных языков гарантируется типовая безопасность, блокируются незаконные обращения к памяти.
Полная базовая библиотека BCL
Содержит множество готовых универсальных вспомогательных классов
- Базовые инструменты для работы с файлами, строками, шифрованием и безопасностью;
- Контейнеры коллекций: списки, словари, хэш-таблицы;
- Инструменты многопоточности, синхронизации и параллелизма;
- Классы чтения и записи XML-документов
- и множество других функций
Вся общая низкоуровневая логика реализована заранее, поэтому разработчику достаточно написать только бизнес-логику, переиспользуя готовые инструменты и избегая повторной разработки.

Схема потока выполнения программы .NET: написанный вами код компилируется в промежуточный код IL. IL может вызывать библиотеки из BCL и затем передается в CLR для запуска.
Взаимосвязь C# и .NET
.NET Framework: полная платформа разработки и выполнения, состоящая из двух центральных компонентов
- CLR (Common Language Runtime): отвечает за управление памятью кода, его выполнение и проверку безопасности
- BCL (Базовая библиотека классов): огромный набор универсального вспомогательного кода (файлы, сеть, графический интерфейс, параллелизм и многое другое)
C#: язык программирования, созданный специально для платформы .NET, предназначен для написания кода, запускающегося на CLR
Помимо C# существуют другие языки с поддержкой .NET, например F# и VB.NET.
Цель платформы .NET — кроссплатформенность и мультиязычность. Кроссплатформенность означает работу на разных операционных системах; мультиязычность — возможность взаимного доступа компонентов, написанных на разных языках.
Компиляция в общий промежуточный язык CIL
Компилятор каждого языка .NET считывает исходные файлы и генерирует выходные файлы под названием сборки (assembly)
Существует два типа сборок: исполняемые файлы (exe) или динамические библиотеки (DLL)
Код внутри сборки — не собственный машинный код процессора, а промежуточный язык под названием Common Intermediate Language (CIL).
Одна сборка содержит основные элементы:
- Инструкции CIL программы
- Метаданные всех типов, определенных в программе
- Метаданные со ссылками на другие внешние сборки
Аббревиатура промежуточного языка менялась на протяжении развития .NET, поэтому разные источники используют разные названия. И Intermediate Language (IL), и Microsoft Intermediate Language (MSIL) обозначают CIL.

Компиляция в машинный код и запуск
CIL не преобразуется в машинный код заранее; только при запуске программы CLR выполняет три шага:
- Проверка информации безопасности сборки
- Выделение памяти для выполнения
- Передача компилятору JIT для пофрагментной компиляции в машинный код
Механизм компиляции JIT по требованию
Компилируется только тот код, который будет выполняться, после компиляции он кэшируется для повторного использования. Не вызываемый код не компилируется, один и тот же фрагмент преобразуется только один раз.
Сборка (CIL + информация о типах) → CLR (компилятор JIT) → Машинный код → Службы операционной системы
Задачи управления CLR
После преобразования CIL в машинный код CLR автоматически управляет: очисткой неиспользуемой памяти, проверкой границ массивов, контролем типов параметров и обработкой исключений.
Управляемый и неуправляемый код
- Управляемый код: код на языках .NET, выполнение которого контролируется CLR
- Неуправляемый код: не под контролем CLR, пример — нативные DLL Win32 на C/C++
Сейчас Microsoft поддерживает компиляцию AOT: можно сразу собрать код C# в машинный код, как в C++. Тогда исполняемый EXE запускается без предварительной установки среды .NET.
Утилита NGen
Выполняет офлайн-предварительную компиляцию сборок в нативные образы. При запуске пропускается шаг JIT, ускоряя старт приложения.
.NET Core AOT — новое поколение предварительной компиляции, генерирует независимые нативные исполняемые файлы без зависимостей от рантайма.
Сборка (Информация о типах, CIL)
↓
Компилятор JIT
↓
Машинный код
↓
Службы операционной системы
Независимо от исходного языка весь код следует одинаковому потоку компиляции и выполнения.
У каждого языка свой компилятор: у VB.NET отдельный компилятор для VB, у C# — свой. Все преобразуют код в CIL, CIL проходит через JIT в машинный код, который исполняется процессором. Именно поэтому программы на .NET требуют установленную среду .NET, как Java нуждается в JRE.
flowchart TD
subgraph Compile_Time
A[C# Source] --> B[C# Compiler]
B --> C[Assembly CIL]
D[VB Source] --> E[VB Compiler]
E --> C
F[Xyz.NET Source] --> G[Xyz.NET Compiler]
G --> C
end
subgraph Run_Time
C --> H[JIT Compiler]
H --> I[Native Code]
I --> J[Operating System Services]
end
На схеме выше показан полный цикл компиляции и запуска для всех языков.
Common Language Runtime (CLR)
Основной компонент .NET Framework — CLR, он располагается над операционной системой и полностью управляет запуском программ.
- Автоматическая сборка мусора (GC)
- Проверка безопасности и аутентификация через Базовую библиотеку классов (BCL)
- Предоставление широких возможностей программирования: веб-службы, службы данных и другие функции
flowchart TD
subgraph Unmanaged_Code
A[Non-.NET Program] --> OS[Operating System]
end
subgraph Managed_Code
B[Assembly] --> CLR[Common Language Runtime]
C[Assembly] --> CLR
D[Assembly] --> CLR
subgraph CLR[Common Language Runtime]
M[Memory Management] --- E[Exception Handling]
G[Garbage Collection] --- R[Reflection Services]
J[JIT Compiler] --- L[Class Loader]
S[Security Services]
end
CLR --> OS
end
Общая инфраструктура языков CLI
Каждый язык программирования содержит набор базовых нативных типов для представления целых чисел, дробных чисел, символов и других данных.
Общая инфраструктура языков (CLI) — набор стандартов, объединяющий все компоненты .NET Framework в единую совместимую систему.
Например, количество бит, занимаемое целым числом, одинаково во всех поддерживаемых языках.
flowchart TD
subgraph CLI[CLI]
CLR[Common Language Runtime] --- CLS[Common Language Specification]
BCL[Base Class Library] --- MDS[Metadata Definition & Semantics]
CTS[Common Type System] --- CIL[Common Intermediate Language]
end
Большинству разработчиков не нужно глубоко изучать всю спецификацию CLI, но обязательно освоить Общую систему типов CTS и Общую спецификацию языков CLS.
CTS Общая система типов
- Стандартизированный набор базовых типов данных с фиксированными свойствами;
- Все собственные типы каждого языка .NET отображаются на подмножество этих стандартных типов;
- Все типы наследуют корневой класс
object; - Благодаря единому стандарту системные и пользовательские типы взаимодействуют между любыми языками .NET.
CLS Общая спецификация языков
Определяет единые правила, которым должны соответствовать все совместимые с .NET языки: ограничения межъязыкового взаимодействия, типы данных, конструкторы классов, передача параметров и другое.
Различия между .NET и .NET Framework
.NET — современная кроссплатформенная платформа Microsoft, а .NET Framework — старый набор рантайма и библиотек, работающий только под Windows. Все новые функции разрабатываются исключительно для .NET; .NET Framework переведен в режим поддержки, ему выпускают только обновления безопасности.
.NET является кроссплатформенной и основной платформой разработки Microsoft. Далее весь материал посвящен именно ей.
| Характеристика | .NET | .NET Framework |
|---|---|---|
| Поддержка платформ | Кроссплатформенность (Windows, Linux, macOS, контейнеры, мобильные устройства через MAUI) | Только Windows |
| Статус | Постоянные обновления (.NET 5 — .NET 10, ежегодные релизы с долгой поддержкой LTS) | Режим поддержки (4.8 финальная версия, только патчи безопасности) |
| Производительность | Быстрый запуск, высокая пропускная способность, оптимизированная сборка мусора | Устаревшая производительность, привязка к API Windows |
| Сценарии использования | Новые проекты: веб-API, микросервисы, облачные приложения, кроссплатформенные десктоп/мобильные программы | Старые проекты: Web Forms, WCF, Windows Workflow и другие |
| Развертывание | Полная совместимость с Docker, контейнерами и облачными средами | Не поддерживает контейнеры, зависит от Windows Server |
| Поддерживаемые языки | C#, F#, VB.NET (кроссплатформенность) | C#, VB.NET (только Windows) |
Различия между .NET и .NET Framework невелики. Оба используют языки C#, F#, VB.NET и имеют одинаковый основной синтаксис. Большая часть написанного кода C# компилируется и запускается как на .NET Framework, так и на .NET (Core/5/6/7/8…).
Разница заключается главным образом в доступном наборе библиотек классов, а не в синтаксисе.
Технологии из .NET Framework: WCF, Web Forms, Windows Workflow убраны или заменены альтернативами в современном .NET.
В новый .NET добавлены современные API: Span<T>, ValueTask, Records, которых нет в старом .NET Framework.
Поскольку .NET Framework работает только под Windows, а .NET кроссплатформенный, часть эксклюзивных для Windows библиотек удалена из .NET. Например, System.Drawing работает под Windows, но в кроссплатформенном .NET помечен как совместимый только с этой ОС. Если нужна библиотека для графики в .NET, нельзя использовать System.Drawing, придется брать стороннее решение — SkiaSharp от Google.
Важно: указанные различия относятся к уровню фреймворка. На уровне языка (C#) их практически нет. Синтаксис C# одинаков в обеих средах. Настоящая разница — в библиотеках классов и среде выполнения, то есть в наборе доступных API.