C# и .NET — Итог

Что такое 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 устраняет ограничения старых поколений инструментов разработки, его основные преимущества:

  1. Поддержка множества устройств: работает на серверах, компьютерах, КПК, мобильных телефонах и другом оборудовании;
  2. Соответствие промышленным стандартам: нативная поддержка универсальных протоколов связи XML, HTTP, SOAP, JSON, WSDL;
  3. Песочница безопасности: обеспечивает изоляцию для безопасного выполнения кода из ненадежных источников.

Три ключевых компонента .NET Framework

  1. CLR Common Language Runtime (среда выполнения) управляет всем жизненным циклом программ: управление памятью и сборка мусора, проверка безопасности кода, планирование потоков, обработка исключений.
  2. Набор инструментов разработки интегрированные среды разработки, мультиязычные компиляторы .NET (C#/VB.NET/F# и другие), отладчики и веб-бэкенд технологии ASP.NET/WCF.
  3. BCL Базовая библиотека классов (также FCL Framework Class Library) содержит огромный набор готовых универсальных классов, которые разработчик может вызывать напрямую.

Улучшения .NET по сравнению с классической разработкой под Windows

Единая объектно-ориентированная модель

CLR, BCL и C# тесно интегрированы и предоставляют единую ООП-модель. Десктопные, мобильные, веб и распределенные приложения используют одинаковую парадигму разработки, синтаксис и логика согласованы на любом устройстве.

Автоматическая сборка мусора GC

В CLR встроен сборщик мусора, который автоматически освобождает память от неиспользуемых объектов. Разработчику не нужно вручную управлять памятью или искать утечки памяти, это значительно снижает нагрузку на поддержку.

Многомерная интероперабельность
  1. Взаимодействие между языками .NET: классы, написанные на разных языках .NET, могут вызывать и наследовать друг друга; платформа не привязана к одному языку программирования;
  2. Вызов платформы P/Invoke: прямой вызов нативных интерфейсов DLL Win32 на языке C;
  3. Совместимость с COM: компоненты .NET и старые COM-компоненты вызываются в обе стороны.

Упрощенное развертывание: нет зависимости от реестра Windows; в минимальных сценариях достаточно скопировать файлы для запуска программы;

Параллельные сборки: на одном устройстве могут сосуществовать разные версии одной DLL. Каждая программа привязывается к той версии библиотеки, с которой была скомпилирована — конфликты версий DLL устранены.

Проверка типовой безопасности CLR (Common Language Runtime) принудительно проверяет параметры и типы данных. Даже при взаимодействии компонентов разных языков гарантируется типовая безопасность, блокируются незаконные обращения к памяти.

Полная базовая библиотека BCL

Содержит множество готовых универсальных вспомогательных классов

  • Базовые инструменты для работы с файлами, строками, шифрованием и безопасностью;
  • Контейнеры коллекций: списки, словари, хэш-таблицы;
  • Инструменты многопоточности, синхронизации и параллелизма;
  • Классы чтения и записи XML-документов
  • и множество других функций

Вся общая низкоуровневая логика реализована заранее, поэтому разработчику достаточно написать только бизнес-логику, переиспользуя готовые инструменты и избегая повторной разработки.

Схема потока выполнения программы .NET: написанный вами код компилируется в промежуточный код IL. IL может вызывать библиотеки из BCL и затем передается в CLR для запуска.

Взаимосвязь C# и .NET

.NET Framework: полная платформа разработки и выполнения, состоящая из двух центральных компонентов

  1. CLR (Common Language Runtime): отвечает за управление памятью кода, его выполнение и проверку безопасности
  2. BCL (Базовая библиотека классов): огромный набор универсального вспомогательного кода (файлы, сеть, графический интерфейс, параллелизм и многое другое)

C#: язык программирования, созданный специально для платформы .NET, предназначен для написания кода, запускающегося на CLR

Помимо C# существуют другие языки с поддержкой .NET, например F# и VB.NET.

Цель платформы .NET — кроссплатформенность и мультиязычность. Кроссплатформенность означает работу на разных операционных системах; мультиязычность — возможность взаимного доступа компонентов, написанных на разных языках.

Компиляция в общий промежуточный язык CIL

Компилятор каждого языка .NET считывает исходные файлы и генерирует выходные файлы под названием сборки (assembly)

Существует два типа сборок: исполняемые файлы (exe) или динамические библиотеки (DLL)

Код внутри сборки — не собственный машинный код процессора, а промежуточный язык под названием Common Intermediate Language (CIL).

Одна сборка содержит основные элементы:

  1. Инструкции CIL программы
  2. Метаданные всех типов, определенных в программе
  3. Метаданные со ссылками на другие внешние сборки

Аббревиатура промежуточного языка менялась на протяжении развития .NET, поэтому разные источники используют разные названия. И Intermediate Language (IL), и Microsoft Intermediate Language (MSIL) обозначают CIL.

Компиляция в машинный код и запуск

CIL не преобразуется в машинный код заранее; только при запуске программы CLR выполняет три шага:

  1. Проверка информации безопасности сборки
  2. Выделение памяти для выполнения
  3. Передача компилятору 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *