C#: что это за язык и в чем его особенности

C#: что это за язык и в чем его особенности Полезное

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# подходит как первый язык. Синтаксис читаемый, а сборка мусора снимает с новичка ручное управление памятью.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)