C# - язык программирования платформы .NET
Play ITЗагрузка интерактивного демо…
Play ITЗагрузка интерактивного демо…
Основы C#
Что такое C#?
C# — это язык программирования со следующими особенностями:
- Типизация — статическая, сильная; вывод типов есть (
var, target-typednew, pattern matching). - Парадигма — мультипарадигменный — объектно-ориентированный, компонентный, функциональный (LINQ, лямбды), императивный, асинхронный.
- Уровень — высокоуровневый.
- Выполнение — компилируемый: исходник → CIL (IL) → JIT на CLR; опционально Native AOT в нативный код без JIT.
- Память — автоматическая (сборщик мусора CLR, mark-and-compact / generational GC).
- Платформа — кроссплатформенный (Windows, Linux, macOS, iOS, Android через .NET); управляемый runtime (CLR); компиляция в промежуточный язык CIL, не транспиляция в другой высокоуровневый язык.
- Формат разработки — обычно требует структуры проекта (
.csproj, SDK); скриптовый режим возможен через.csxиdotnet-script. - Направление — универсальный; сильные стороны — корпоративный бэкенд (ASP.NET Core), desktop (WPF, WinForms), мобильные (MAUI), игры (Unity), облако и микросервисы.
- REPL — есть — окно C# Interactive в Visual Studio,
csi(устаревает), скриптыdotnet-script; в терминале —dotnet runдля небольших консольных проектов. - Поколение — классический (с 2000 года), активно развивающийся (ежегодные релизы C# и .NET).
- Параллелизм и асинхронность — нативно — потоки (
Thread,Task), TPL (Parallel.*),async/awaitдля неблокирующего I/O;lock,Interlocked, каналы и пулы потоков. - Безопасность — относительно "безопасный" — сильная статическая типизация, проверки CLR, nullable reference types; блоки
unsafeи указатели снижают гарантии; нет уровня memory safety как у Rust.
Если какой-то пункт из списка непонятен — подробные определения и примеры в Язык программирования.
Название и произношение
Язык называют C# (произношение — "си шарп", от англ. sharp — диез). Игра слов: после C и C++ (инкремент ++) символ # можно представить как четыре знака +, то есть "C++++". В коде и в спецификации ECMA используется знак решётки #, а не символ ноты ♯ — его нет на обычной клавиатуре. Расширения файлов: .cs (исходник), .csx (скрипт для dotnet-script / REPL).
Внутреннее кодовое имя проекта до релиза — COOL (C-style Object Oriented Language). Публичный анонс — июль 2000 года вместе с бета-версией .NET.
Стандарт языка
Синтаксис и семантика C# описаны в стандарте ECMA-334 (также ISO/IEC 23270). Это отдельный документ от ECMA-335 / ISO/IEC 23271, который задаёт CLI (формат сборок, CIL, runtime). Компилятор C# (Roslyn) и среда CLR связаны, но стандартизируются разными спецификациями.
Актуальный текст на Learn: спецификация C#. Сводная таблица версий C# ↔ .NET ↔ Visual Studio — Версии C# и .NET.
C# перенял идеи из C++, Java, Delphi, Modula-3, Smalltalk; на него опираются F#, PowerShell, во многом — Kotlin (свойства, null-безопасность, корутины). См. Историю платформы .NET. Подробное сравнение с Java — отдельная статья.
В рунет-дискурсе
В рунете C# и .NET долго шли в одной связке с Windows и Microsoft: в "войнах ОС" их противопоставляли Linux и Java, в играх — Unity и modding. После open source CoreCLR и кроссплатформенного dotnet часть флейма устарела, но старые цитаты про "монополию" ещё всплывают.
В переписке различайте язык (C#), runtime (CLR) и SDK (dotnet). Социальный контекст платформы — история .NET; указатель — Неолурк (C#).
Возможности C#
Какие возможности предоставляет C#?
- писать код один раз и запускать его на разных платформах — Windows, Linux, macOS, iOS, Android;
- разработка desktop-приложений (WinForms, WPF), мобильных (.NET MAUI), веб-приложений (ASP.NET Core), микросервисов;
- совместимость с обширной библиотекой классов .NET, что даёт доступ к готовым решениям для работы с файлами, сетью, базами данных, графикой и многим другим;
- строгая система типов снижает риск ошибок времени выполнения;
- автоматическое управление памятью (Garbage Collection);
- работать с лямбдами, неизменяемыми коллекциями, функциями высшего порядка;
- ключевые слова async/await для неблокирующего кода при ожидании I/O (сеть, диск, БД);
- компиляция в IL с JIT или в нативный код через Native AOT; выполнение на .NET Runtime; деплой в контейнерах и облаке;
- интеграция с одной из самых мощных экосистем, включающей ASP.NET, Entity Framework, WPF, WinForms, MAUI и другие технологии;
- работа с SQL через ADO.NET и Entity Framework Core;
- разработка корпоративных систем - ERP, CRM, HRM, банковские системы, где важна надёжность и долгосрочная поддержка;
- создание 2D и 3D игр с использованием Unity, Godot и других движков — для Unity см. курс в редакторе и готовые скрипты в Lab.
Как работать с C#?
С чего начать?
Ну, во-первых, сначала отметим, что документация у C# широкая и доступна на сайте Microsoft - https://learn.microsoft.com/ru/dotnet/csharp/
Чит-лист - https://cheatsheets.zip/cs
Во-вторых, представим, что вы уже понимаете, какую программу хотите написать. Тогда ваши шаги будут следующими:
- Установить .NET.
- Установить Visual Studio или другую IDE.
- Определить технологию:
- общий тип – консоль или пользовательский интерфейс;
- работа приложений – WinForms/WPF/ASP.NET Core;
- работа с данными – EF Core или ADO.NET.
- Установить необходимые библиотеки через NuGet.
- Приступить к написанию кода.
Поговорим о библиотеках.
Путь от .cs до запуска на .NET:
АЛГОРИТМ ЗапускCSharp(Program.cs)
IL := компилятор.скомпилировать(Program.cs) // CIL / MSIL
сборка := упаковать(IL, метаданные) // .dll или .exe
CLR.загрузить(сборка)
нативный := JIT(IL) // или AOT заранее
выполнить(точка_входа Main)
КОНЕЦ
Код компилируется в два основных формата – DLL и EXE.
- EXE – исполняемый файл, который и запускает программу.
- DLL – библиотека, не исполняемый файл, который содержит уже "упакованный" набор классов и методов.
Эти файлы содержат в себе:
- скомпилированный код;
- метаданные (информация о типах, методах, свойствах);
- манифест (список зависимостей, версии, автор и т.д.).
Эти файлы образуют собой сборку – готовое приложение.
Итоговая сборка может быть Debug и Release (отладочное и финальное). Сборки пакуются в каталог bin/ в решении. Пример:
C:/MyApp/bin/Debug/MyApp.exe
DLL-файл предоставляет методы, которые можно вызывать из других программ. К примеру, если вам нужно осуществить математическую операцию, вы добавляете библиотеку к своему коду, используя ключевое слово using. Это всё равно, что сказать: "Здравствуй. Сейчас мы будем с тобой работать. Нам понадобится учебник №1 и учебник №2". Это и будет некая установка для программы, что мы будем ссылаться на эти "учебники". И если сразу не договориться с программой, то это будет равнозначно тому, что ученик придёт на урок, забыв учебники дома, и не сможет учиться – он не поймёт, о чем будет идти речь. И тогда Visual Studio намекнёт – "братишка, я не понимаю о чём ты – я не знаю никакого ITelegramBotClient":

Но стоит установить из NuGet библиотеку Telegram.Bot, и добавить в код:
using Telegram.Bot;
И вуаля – ошибок нет

Отсюда ключевая фишка – API в .NET позволяет ссылаться на сборки через using на пространства имён – namespace. Подробнее: Пространства имён в C#.
Исходный код хранится в файлах .cs для C#. Там пишется логика приложения. В проекте можно создавать новые файлы, и через внутреннее API платформы будет взаимодействие между ними. Допустим, можно сделать, что логика для работы с базой данных будет в одном файле, а логика для вывода данных на интерфейс – в другом.
Файлы проекта – это не .cs.
Проект – это набор файлов, который при сборке превращается в .dll или .exe. Сведения о структуре проекта хранятся в файле .csproj – это XML-файл, описывающий структуру проекта.
Там указывается:
- какие .cs файлы входят в проект;
- какие NuGet-пакеты подключены (зависимости);
- какая версия .NET используется (допустим, 8.0);
- настройки компиляции (Debug/Release).
Файлы решения - .sln (solution file). Он объединяет несколько .csproj в один проект.
Приложение – это готовое решение. Можно собирать всё решение целиком.
Структура решения может быть такой:
MySolution/
src/
MyApp/
MyApp.csproj
Program.cs
appsettings.json
Конфигурация хранится в файле appsettings.json (допустим, строки подключения, содержащие путь к базе данных).
Точка входа и консольный ввод-вывод
В современных шаблонах .NET точка входа — файл Program.cs с top-level statements (без обязательного класса Program и метода Main):
Console.WriteLine("Приложение запущено");
Классический вариант с static void Main(string[] args) по-прежнему допустим. Аргументы командной строки приходят в массив args. Разбор exe vs library — Main и top-level statements.
Взаимодействие программы с пользователем – одна из основных задач любого приложения. В C# стандартный ввод и вывод осуществляются через класс Console.
- Вывод данных: Console.WriteLine(), Console.Write();
- Ввод данных: Console.ReadLine().
- Чтение одного символа: Console.ReadKey().
Пример:
string name = Console.ReadLine();
Console.WriteLine($"Здравствуйте, {name}!");
Как читать эту тему на практике
Если вы только начинаете, полезно проходить материал в таком порядке:
- Понять, что такое файл
.cs, проект.csprojи решение.sln. - Запустить минимальную программу в
Program.cs. - Подключить одну внешнюю библиотеку через NuGet.
- Собрать проект в
Debug, затем вRelease, и сравнить результат.
Минимальный цикл работы через CLI:
dotnet new console -n HelloCSharp
cd HelloCSharp
dotnet run
dotnet build -c Release
Это даёт опору: вы видите путь "исходники -> сборка -> запуск" не в теории, а руками.
Частые ошибки новичков
- Путают
using(подключение пространств имён) и установку пакета NuGet: одногоusingбез пакета недостаточно. - Думают, что
.slnобязателен для запуска любого проекта. На деле достаточно.csproj, а.slnнужен для удобной работы с несколькими проектами. - Смешивают "проект" и "приложение": проект может быть библиотекой (
.dll), которую запускает другое приложение. - Пишут всё в одном
Program.csи быстро получают "монолитный" файл без структуры.
Мини-чеклист структуры проекта
Когда проект начинает расти, проверьте:
- есть ли отдельные папки
Domain,Application,Infrastructureили аналогичные по роли; - вынесены ли настройки в
appsettings.jsonи переменные окружения; - нет ли дублирующихся
usingи хаотичных зависимостей между модулями; - понятны ли имена сборок и namespace для каждого слоя.