C# (произносится «си шарп») — это компилируемый язык программирования общего назначения со статической типизацией, разработанный в Microsoft для платформы .NET. На нем пишут веб-сервисы, десктопные и мобильные приложения, облачные сервисы и игры. Ниже разбираю, из чего состоит язык, чем платформа .NET отличается от самого языка и какие особенности C# отличают его от близких C++ и Java.
Содержание
C# появился в начале 2000-х под руководством Андерса Хейлсберга (автора Turbo Pascal и Delphi). Это не «облегченная версия C++»: язык спроектировали заново, а сходство синтаксиса с C-семейством — осознанное решение, чтобы снизить порог входа.
Язык, платформа и рантайм: различаем термины
Эти три понятия часто смешивают, поэтому развожу их сразу:
- C# — язык: синтаксис и правила, по которым вы пишете исходный код.
- .NET — платформа: рантайм, компилятор и большая стандартная библиотека классов (BCL), которые исполняют вашу программу.
- CLR (Common Language Runtime) — виртуальная машина внутри .NET: она исполняет промежуточный код, управляет памятью и сборкой мусора.
Цепочка выглядит так: исходник на C# компилируется в промежуточный байткод (IL), а CLR при запуске превращает IL в машинный код конкретной платформы (JIT-компиляция). Поэтому одна и та же сборка может работать на Windows, Linux и macOS.
Важное различие в самой платформе: старый .NET Framework — только для Windows и больше не развивается функционально. Современный .NET (версии 5 и выше, вырос из проекта .NET Core) — кроссплатформенный и с открытым исходным кодом. Актуальная версия на момент обновления — .NET 10 (LTS) с языком C# 14.
Ключевые особенности языка
Статическая типизация
Тип переменной известен на этапе компиляции, а не во время выполнения. Несовместимость типов ловится до запуска. Сначала неверный код:
int age = "тридцать";
Компилятор откажется собирать проект:
error CS0029: Cannot implicitly convert type 'string' to 'int'
Исправленный вариант:
int age = 30;
Console.WriteLine(age); // 30
Это снижает число ошибок в проде, но требует объявлять типы явно. Ключевое слово var — не отказ от типизации: тип выводится компилятором из правой части, переменная остается строго типизированной.
Автоматическая сборка мусора
Память под объекты выделяется в управляемой куче, а освобождает ее сборщик мусора (GC), когда на объект больше нет ссылок. Ручной free, как в C++, писать не нужно, что убирает целый класс ошибок с утечками и «висячими» указателями. Оговорка: GC управляет только памятью. Внешние ресурсы (файлы, сетевые соединения) освобождают явно — через using и интерфейс IDisposable.
Свойства вместо голых полей
Свойство (property) выглядит как поле, но за чтением и записью стоят методы-аксессоры. Это дает контроль над доступом без лишнего кода:
public class Course
{
public string Title { get; set; }
public int Hours { get; init; } // задается только при создании
}
Здесь Title можно менять в любой момент, а Hours фиксируется при инициализации объекта и дальше только читается.
LINQ — запросы к данным прямо в языке
LINQ (Language Integrated Query) — единый синтаксис выборки, фильтрации и группировки для коллекций, баз данных и XML. Минимальный полный пример, который можно скопировать и запустить:
using System;
using System.Linq;
using System.Collections.Generic;
var numbers = new List<int> { 4, 7, 2, 9, 5 };
var evens = numbers.Where(n => n % 2 == 0).OrderBy(n => n);
Console.WriteLine(string.Join(", ", evens));
В консоли появится:
2, 4
Разбор по шагам: Where оставляет только четные числа, OrderBy сортирует их по возрастанию, string.Join склеивает результат через запятую. Тот же подход применим к строкам таблицы БД через Entity Framework — меняется источник, а не код запроса.
async/await — асинхронность без ручных колбэков
Операции ввода-вывода (запрос к сети, чтение файла) не блокируют поток: пока идет ожидание, поток свободен для другой работы. Пример:
using System;
using System.Threading.Tasks;
async Task<int> LoadAsync()
{
await Task.Delay(100); // имитация запроса на 100 мс
return 42;
}
int result = await LoadAsync();
Console.WriteLine(result); // 42
Метод помечен async и возвращает Task<int>; await приостанавливает выполнение до готовности результата, не занимая поток ожиданием. Программа выведет 42 после паузы в 100 миллисекунд. Это упрощает написание отзывчивого кода в вебе и в интерфейсах.
Чем C# отличается от близких языков
Синтаксис C# похож на C++ и Java, но ниши и модель памяти у них разные:
| Признак | C# | Java | C++ |
|---|---|---|---|
| Управление памятью | сборщик мусора | сборщик мусора | ручное или умные указатели |
| Компиляция | в IL, затем JIT | в байткод JVM, затем JIT | сразу в машинный код |
| Основная платформа | .NET | JVM | нативная, без рантайма |
| Свойства и LINQ | есть в языке | нет (геттеры/сеттеры, Streams) | нет |
Вывод из таблицы: C++ выбирают, когда важен прямой контроль над памятью и максимум производительности без рантайма; Java и C# ближе друг к другу по модели, а выбор между ними чаще определяется экосистемой (JVM против .NET).
Выводы
- C# — компилируемый статически типизированный язык общего назначения; работает не сам по себе, а на платформе .NET.
- Различайте уровни: C# — это язык, .NET — платформа с библиотеками, CLR — рантайм, который исполняет IL-код и управляет памятью.
- Отличительные особенности: статическая типизация, автоматическая сборка мусора, свойства, LINQ и async/await.
- Современный .NET (версии 5 и выше) — кроссплатформенный и открытый; старый .NET Framework остается только под Windows.
- C# универсален по применению, но модель памяти и рантайм отличают его от C++; с Java он ближе по устройству.
Где применяется / связь с практикой
Область применения C# широкая, и удобно смотреть на нее по задаче:
- Веб и API — фреймворк ASP.NET Core: серверные приложения, REST-сервисы, backend под высокую нагрузку.
- Облако и микросервисы — сервисы под Linux-контейнеры, в том числе в Azure.
- Десктоп под Windows — WPF и WinForms для настольных приложений.
- Мобильные и кроссплатформенные приложения — .NET MAUI (развитие прежнего Xamarin) под Android и iOS из одной кодовой базы.
- Игры — движок Unity использует C# как основной язык скриптов.
- Утилиты и автоматизация — консольные инструменты и фоновые службы.
Освойте тему на практике
Чтобы перейти от обзора к рабочим навыкам, полезен структурированный старт с практикой и код-ревью. Системно освоить синтаксис, типы, ООП и работу с .NET помогает курс C# Basic в Otus. Посмотреть формат занятий и разобрать тему с преподавателем можно на открытых уроках Otus — они бесплатные и проходят регулярно.
FAQ
C# и .NET — это одно и то же?
Нет. C# — язык программирования, .NET — платформа (рантайм и библиотеки), на которой он исполняется. На .NET, кроме C#, работают и другие языки, например F# и Visual Basic.
C# — это версия C++?
Нет, это отдельный язык, спроектированный заново. Похож синтаксис C-семейства, но модель памяти (сборщик мусора вместо ручного управления) и рантайм .NET принципиально другие.
Можно ли писать на C# под Linux и macOS?
Да. Современный .NET (версии 5 и выше, прежний .NET Core) кроссплатформенный. Ограничение только у старого .NET Framework — он работает исключительно под Windows.
Нужно ли знать C++ или Java перед C#?
Нет, C# подходит как первый язык. Синтаксис читаемый, а сборка мусора снимает с новичка ручное управление памятью.



