Перейти к основному содержимому

C# - язык программирования платформы .NET

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…

Play ITЗагрузка интерактивного демо…


Основы C#

Что такое C#?

C# — это язык программирования со следующими особенностями:

  • Типизация — статическая, сильная; вывод типов есть (var, target-typed new, 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

Во-вторых, представим, что вы уже понимаете, какую программу хотите написать. Тогда ваши шаги будут следующими:

  1. Установить .NET.
  2. Установить Visual Studio или другую IDE.
  3. Определить технологию:
    • общий тип – консоль или пользовательский интерфейс;
    • работа приложений – WinForms/WPF/ASP.NET Core;
    • работа с данными – EF Core или ADO.NET.
  4. Установить необходимые библиотеки через NuGet.
  5. Приступить к написанию кода.

Поговорим о библиотеках.

Путь от .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":

image.png

Но стоит установить из NuGet библиотеку Telegram.Bot, и добавить в код:

using Telegram.Bot;

И вуаля – ошибок нет

image-1.png

Отсюда ключевая фишка – 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}!");

Как читать эту тему на практике

Если вы только начинаете, полезно проходить материал в таком порядке:

  1. Понять, что такое файл .cs, проект .csproj и решение .sln.
  2. Запустить минимальную программу в Program.cs.
  3. Подключить одну внешнюю библиотеку через NuGet.
  4. Собрать проект в 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 для каждого слоя.

Смежные статьи