C# — итоги
Кратко — что стоит унести из раздела "C#". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации, с которыми сталкиваются новички при работе с C# и .NET. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.
Вопрос. dotnet run пишет, что framework "net8.0" (или другой) не найден — проект с GitHub не стартует.
Ответ. Установленный SDK/runtime не совпадает с TargetFramework в .csproj. Поставьте нужный .NET SDK или временно смените целевую версию в проекте. Сверьте LTS/STS в таблице версий. Подробнее здесь — глава 1.
Вопрос. Программа падает с NullReferenceException, хотя "вроде всё инициализировал".
Ответ. Ссылочное поле осталось null — часто после десериализации JSON, конструктора без параметров или цепочки obj?.Child?.Value, где обрывается раньше, чем вы думали. Включите nullable reference types и пройдите предупреждения компилятора. Подробнее здесь — nullable, исключения.
Вопрос. Компилятор: "The name 'Console' does not exist" или "type or namespace could not be found".
Ответ. Не хватает директивы using, ссылки на NuGet-пакет или ProjectReference на другую сборку. Проверьте пространство имён класса и что файл лежит в том же проекте. Подробнее здесь — пространства имён, первая программа.
Вопрос. Изменил код, перезапустил — поведение как у старой версии.
Ответ. Запускается старый билд из другой папки, другой конфигурации (Release вместо Debug) или процесс ещё держит DLL. Выполните dotnet clean, пересоберите решение, закройте висящий экземпляр приложения. Подробнее здесь — глава 1, платформа .NET.
Вопрос. После async/await приложение "замирает" или падает с deadlock.
Ответ. Типичная причина — блокирующий вызов .Result или .Wait() на UI-потоке или внутри синхронного контекста, который ждёт тот же поток. Используйте await до конца цепочки; для библиотек — ConfigureAwait(false) там, где это уместно. Подробнее здесь — Task и async/await, асинхронность.
Вопрос. foreach по списку падает: "Collection was modified".
Ответ. Во время обхода коллекции код добавил или удалил элементы в том же списке. Соберите элементы для удаления в отдельный список или итерируйте копию (ToList()). Подробнее здесь — коллекции, циклы.
Вопрос. LINQ-запрос "работает" в отладке, а в базе возвращает пусто или старые данные.
Ответ. Запрос к EF Core откладывается до ToList(), Count() или перечисления; до этого вы могли изменить фильтр или контекст. Явно материализуйте результат и проверьте SQL в логах провайдера. Подробнее здесь — LINQ, EF Core.
Вопрос. Время в логах "уехало" на три часа относительно часов на компьютере.
Ответ. Смешали UTC и локальный часовой пояс — DateTime.Now vs DateTime.UtcNow, сервер в Docker часто в UTC. Для хранения и API предпочитайте DateTimeOffset или UTC с явной конвертацией при выводе. Подробнее здесь — типы и приведения, справочник BCL.
Вопрос. 0.1 + 0.2 == 0.3 даёт false — это баг языка?
Ответ. Это ограничение двоичного представления float/double. Для денег используйте decimal; для сравнения дробей — допуск (Math.Abs(a - b) < epsilon) или округление. Подробнее здесь — типы.
Вопрос. Скрипт Unity компилируется без ошибок, но в игре ничего не происходит.
Ответ. Класс не повешен на GameObject на сцене, метод не Start/Update, или ссылка на компонент в Inspector пустая. Проверьте консоль Unity на runtime-ошибки. Подробнее здесь — ООП в C# (блок Unity), разработка игр.
Вопрос. Урок из интернета на .NET Framework 4.x, а у меня .NET 8 — половина API "не существует".
Ответ. Часть пакетов и пространств имён переехала или устарела (System.Web, старые WCF-шаблоны). Ищите аналог для современного .NET или создайте проект под нужный TFM осознанно. Подробнее здесь — версии C# и .NET, история платформы.
Вопрос. dotnet restore или NuGet: "Unable to load package" / 401 / timeout.
Ответ. Проверьте интернет, прокси, зеркало nuget.org в NuGet.Config, версию пакета и что источник пакетов доступен в IDE. Корпоративные feed требуют авторизации. Подробнее здесь — глава 1, веб и API.
Вопрос. Жёлтое предупреждение CS8618: "Non-nullable field must contain a non-null value".
Ответ. Компилятор видит свойство без гарантированной инициализации. Задайте значение в конструкторе, используйте required, null! только если уверены, или сделайте тип nullable (string?). Подробнее здесь — nullable.
Вопрос. Сборка падает: "Could not copy … file is locked by another process".
Ответ. Запущенный экземпляр приложения или антивирус держит .exe/.dll. Закройте процесс в диспетчере задач, остановите отладку в IDE, при необходимости перезапустите Visual Studio. Подробнее здесь — глава 1.
Вопрос. Ошибка CS0017: "Program has more than one entry point".
Ответ. В проекте несколько методов static void Main или лишний файл с точкой входа (часто после копирования примера). Оставьте один Main или укажите startup object в свойствах проекта. Подробнее здесь — синтаксис, глава 1.
Вопрос. JSON из API приходит с camelCase, а мои свойства PascalCase — всё null после десериализации.
Ответ. Настройте JsonSerializerOptions.PropertyNamingPolicy или атрибуты [JsonPropertyName]. По умолчанию System.Text.Json чувствителен к регистру. Подробнее здесь — сериализация, веб и HTTP.
Вопрос. ASP.NET Core отдаёт 404 на контроллер, который "точно есть".
Ответ. Проверьте маршрут ([Route], [HttpGet]), регистрацию контроллеров, базовый путь (UsePathBase), что запрос идёт на правильный порт и метод (GET vs POST). Подробнее здесь — ASP.NET, веб-разработка.
Вопрос. В Debug всё работает, в Release падает или ведёт себя иначе.
Ответ. Оптимизация JIT, отсутствие проверок, гонки потоков и неинициализированные поля проявляются только в Release. Соберите Release с символами, воспроизведите под отладчиком. Подробнее здесь — производительность, потоки.
Вопрос. Файлы или сокеты "течут" — дескрипторы не закрываются.
Ответ. Типы с неуправляемыми ресурсами нужно оборачивать в using или await using и реализовывать IDisposable/IAsyncDisposable. Без этого GC освободит память, но не OS-ресурс сразу. Подробнее здесь — ООП, исключения и finally.
Вопрос. Сравнение строк "i" и "I" на сервере даёт неожиданный результат.
Ответ. По умолчанию сравнение зависит от культуры. Для идентификаторов и паролей используйте StringComparison.Ordinal или OrdinalIgnoreCase. Подробнее здесь — строки и операторы, справочник.
Вопрос. StackOverflowException при "простом" рекурсивном обходе дерева.
Ответ. Нет базового случая или глубина превышает размер стека. Перепишите на итерацию со стеком/Queue или ограничьте глубину. Подробнее здесь — функции и рекурсия, архитектура выполнения.
Вопрос. Hot Reload не подхватывает изменения в методе или в Razor.
Ответ. Hot Reload поддерживает ограниченный набор правок — смена сигнатуры, добавление полей, правки в некоторых шаблонах требуют полной пересборки. Остановите приложение и соберите заново. Подробнее здесь — глава 1, ASP.NET.
Вопрос. EF Core: "Pending model changes" или миграции не применяются к базе.
Ответ. Модель в коде разошлась с последней миграцией — выполните dotnet ef migrations add и database update, проверьте строку подключения и что смотрите ту же БД, что и приложение. Подробнее здесь — EF Core, БД и ORM.
Вопрос. Visual Studio или VS Code — что ставить новичку?
Ответ. Visual Studio удобнее для WinForms/WPF/Unity и больших solution; VS Code легче для консоли, ASP.NET и кроссплатформы с расширением C# Dev Kit. Оба бесплатны для обучения. Подробнее здесь — оглавление раздела, первая программа.
Вопрос. Хочу делать игры — обязательно ли проходить весь раздел до ASP.NET?
Ответ. Для Unity достаточно ветки типы, управление потоком, ООП, коллекции, делегаты — веб-статьи можно отложить. Маршрут "Unity + C#" описан в intro раздела. Подробнее здесь — разработка игр.
Вопрос. Курс по Xamarin не открывается — проект не собирается в 2025 году.
Ответ. Xamarin.Forms снят с поддержки; новые мобильные проекты на .NET делают на MAUI. Старые материалы используйте для идей UI, код переносите по гайдам Microsoft. Подробнее здесь — MAUI — первая программа, версии.
Вопрос. InvalidCastException при приведении через (MyType)obj.
Ответ. Объект в рантайме другого типа (часто после boxing, наследования или десериализации в object). Используйте as + проверку на null или pattern matching obj is MyType t. Подробнее здесь — типы и приведения, ООП.
Вопрос. Событие UI не срабатывает — подписался через +=, но handler молчит.
Ответ. Проверьте, что подписка на тот же экземпляр, что генерирует событие, handler не async void с проглоченным исключением, и имя события совпадает с API (WPF routed events vs обычные). Подробнее здесь — делегаты и события.
Вопрос. Тесты зелёные локально, на CI в Linux падают с "file not found".
Ответ. Пути с обратным слэшем и регистр имён файлов на Linux строгий. Используйте Path.Combine, относительные пути от content root, не хардкодьте C:\. Подробнее здесь — тестирование, глава 1.
Вопрос. Стоит ли учить C# первым языком, если в школе уже проходят Python?
Ответ. Python быстрее для первых алгоритмов; C# даёт строгую типизацию, IDE и путь в .NET/Unity. Имеет смысл после базовых алгоритмов или параллельно, если цель — игры, Windows или корпоративный .NET. Подробнее здесь — дорожная карта, вопросы на собеседование.
Вопрос. Как установить C# и .NET на Windows 11 / 10?
Ответ. Скачайте .NET SDK с сайта Microsoft, проверьте dotnet --version в терминале, создайте проект dotnet new console. Visual Studio Community ставит SDK и шаблоны вместе. Подробнее здесь — первая программа, платформа .NET.
Вопрос. Чем C# отличается от C++?
Ответ. C# — управляемый язык .NET со сборкой мусора и проверками в CLR; C++ даёт ручную память и компиляцию в нативный код. C# проще для веба, Unity и корпоративных приложений; C++ — для движков, embedded и максимальной производительности. Подробнее здесь — вводная C#, C++ — о разделе.
Вопрос. Чем C# отличается от Java?
Ответ. Оба строго типизированы и ООП, но C# живёт в экосистеме .NET (Unity, ASP.NET, WinUI), Java — в JVM (Android, Spring). Синтаксис похож, переносить мышление легко, API и инструменты разные. Подробнее здесь — Сравнение C# и Java, Java — о разделе.
Вопрос. Что такое .NET простыми словами?
Ответ. .NET — платформа: runtime (CLR), библиотеки (BCL), компилятор C#/F#/VB и инструменты (dotnet). Программа компилируется в IL и выполняется CLR на Windows, Linux и macOS. Подробнее здесь — платформа .NET, история .NET.
Вопрос. Как создать консольное приложение на C#?
Ответ. В терминале: dotnet new console -n MyApp, затем cd MyApp и dotnet run. Точка входа — метод Main в Program.cs. Подробнее здесь — C# — первая программа, синтаксис.
Вопрос. C# или Python — что выбрать начинающему?
Ответ. Python быстрее для скриптов и data science; C# — для типобезопасных приложений, Unity, .NET и Windows. Выбор зависит от цели: игры/корпоративный стек → C#; анализ данных/автоматизация → Python. Подробнее здесь — дорожная карта, Python — о разделе.
Вопрос. Как подключить базу данных к проекту на C#?
Ответ. Для учёбы — ADO.NET или Dapper; для приложений — Entity Framework Core со строкой подключения в appsettings.json и миграциями. Пакеты ставятся через NuGet. Подробнее здесь — EF Core, ADO.NET / Dapper, БД и ORM.
Вопрос. Что такое LINQ в C# и зачем он нужен?
Ответ. LINQ — единый синтаксис запросов к коллекциям, XML и (через EF) к таблицам БД: Where, Select, OrderBy. Уменьшает циклы и делает код читаемее. Подробнее здесь — LINQ, коллекции.
Вопрос. async и await в C# — объясните простыми словами.
Ответ. async/await освобождают поток на время ожидания I/O (сеть, диск, БД), не блокируя UI. Метод возвращает Task или Task<T>; await дожидается результата без "заморозки" окна. Подробнее здесь — Task и async/await, асинхронность.
Вопрос. Как научиться C# с нуля бесплатно?
Ответ. Маршрут: установить SDK → консоль и синтаксис → ООП → коллекции/LINQ → веб (ASP.NET) или Unity по цели. В энциклопедии — пошаговое оглавление раздела и итоги с FAQ. Подробнее здесь — глава 1, Microsoft Learn справочник.
Вопрос. C# для Unity — с чего начать изучение языка?
Ответ. Освойте переменные, if/for, классы и MonoBehaviour, затем коллекции и события — без ASP.NET на первом этапе. Таблица тем Unity+C# — в intro раздела C#. Подробнее здесь — ООП (Unity), разработка игр, скрипты в Lab.
Вопрос. Как сделать сайт на C# (ASP.NET Core)?
Ответ. Шаблон dotnet new webapp или MVC, контроллеры/Razor Pages, публикация на хостинг с runtime .NET. Для API — Minimal APIs или Web API контроллеры. Подробнее здесь — ASP.NET, веб-разработка и API.
Вопрос. Сколько времени учить C# до уровня junior?
Ответ. При регулярной практике (10–15 ч/нед) базу синтаксиса и простой проект можно закрыть за 2–4 месяца; junior на рынке — ещё пет-проекты, Git, SQL и фреймворк (ASP.NET/Laravel-аналог). Срок сильно зависит от фона. Подробнее здесь — карьера в IT, вопросы на собеседование.
Вопрос. Что такое NuGet в C#?
Ответ. NuGet — менеджер пакетов для .NET: библиотеки (JSON, EF, тесты) подключаются одной командой dotnet add package. Аналог npm для JavaScript или pip для Python. Подробнее здесь — глава 1, веб-платформа .NET.
Вопрос. record в C# — что это и когда использовать?
Ответ. record — тип для неизменяемых данных с value-based равенством (DTO, настройки, события). Короче класса с ручным Equals/GetHashCode. Подробнее здесь — ООП, версии C#, справочник.
Вопрос. Как читать ошибки компилятора C# (CSxxxx)?
Ответ. Код CS + номер и первая строка с файлом/строкой — главное; двойной клик в IDE открывает место. Частые: CS1002 (точка с запятой), CS0246 (тип не найден). Подробнее здесь — синтаксис, справочник.
Вопрос. WPF или WinForms — что выбрать в 2025 году?
Ответ. WinForms — проще для учебных окон на Windows; WPF — XAML, привязка данных, масштабируемый UI. Новые кроссплатформенные desktop — .NET MAUI. Подробнее здесь — десктоп WinForms, WPF, MAUI, галерея примеров (Lab).
Вопрос. Entity Framework Core — что это?
Ответ. EF Core — ORM для .NET: классы C# мапятся на таблицы SQL, запросы пишутся на LINQ, схема версионируется миграциями. Подробнее здесь — EF Core — первая программа, обзор БД.
Вопрос. Nullable reference types в C# — как включить?
Ответ. В .csproj: <Nullable>enable</Nullable>; типы string? допускают null, string — нет. Компилятор предупреждает о возможном null. Подробнее здесь — nullable.
Вопрос. Делегаты и события в C# — в чём разница?
Ответ. Делегат — тип для ссылки на метод; событие — обёртка с ограничением подписки (+=/-=) для паттерна издатель–подписчик. Action/Func — готовые делегаты. Подробнее здесь — делегаты и события.
Вопрос. Что такое CLR в .NET?
Ответ. CLR (Common Language Runtime) — виртуальная машина .NET: загружает IL, JIT-компилирует в машинный код, управляет памятью (GC), исключениями и потоками. Подробнее здесь — архитектура .NET, глава 1 C#.
Вопрос. Можно ли программировать на C# в Linux и macOS?
Ответ. Да — .NET кроссплатформенный: dotnet SDK, VS Code + C# Dev Kit, ASP.NET и консоль работают одинаково. WinForms/WPF — в основном Windows; MAUI — Windows, macOS, mobile. Подробнее здесь — версии и .NET, платформа .NET.
Вопрос. Как настроить C# в Visual Studio Code?
Ответ. Установите .NET SDK, расширение C# Dev Kit, откройте папку с .csproj, выполните dotnet restore. Отладка — F5 с launch.json (создаётся автоматически). Подробнее здесь — первая программа, оглавление.
Вопрос. Как стать .NET разработчиком — с чего начать карьеру?
Ответ. База C# → Git → SQL → один стек (ASP.NET Core или Unity) → пет-проект в портфолио. Полезны HTTP, основы ООП и тесты (xUnit). Подробнее здесь — карьера в IT, вопросы на собеседование .NET.
Вопрос. Вопросы на собеседование C# junior — что чаще всего спрашивают?
Ответ. Типы value/reference, ООП, LINQ, async, коллекции, основы ASP.NET и SQL. В разделе — карта вопросов со ссылками на статьи по темам. Подробнее здесь — Вопросы на собеседование .NET и C# — собеседование .NET, чек-лист.
Что запомнить
C# — это современный, строго типизированный, объектно-ориентированный язык программирования, разработанный Microsoft как часть платформы .NET. Он сочетает в себе выразительность, безопасность и производительность, поддерживая множество парадигм — процедурную, объектно-ориентированную, функциональную и асинхронную.
Основные особенности C#:
- Строгая статическая типизация — ошибки типов выявляются на этапе компиляции;
- Автоматическое управление памятью — сборка мусора освобождает разработчика от ручного управления памятью;
- Безопасность выполнения — проверка границ массивов, приведений типов, исключений;
- Поддержка асинхронности — ключевые слова
async/awaitупрощают написание неблокирующего кода; - Функциональные возможности — лямбда-выражения, LINQ, кортежи, сопоставление с образцом;
- Метапрограммирование — атрибуты, рефлексия, исходные генераторы;
- Кроссплатформенность — благодаря .NET 5+ приложения работают на Windows, Linux и macOS;
- Богатая стандартная библиотека — коллекции, работа с файлами, сетью, датами, регулярными выражениями и многим другим.
C# применяется в широком спектре задач:
- Веб-разработка — ASP.NET Core, Minimal APIs, Blazor;
- Десктопные приложения — WPF, WinForms, MAUI;
- Мобильные приложения — .NET MAUI (кроссплатформенные); Xamarin — устаревшая линейка, новые проекты на MAUI;
- Игры — Unity, Godot;
- Микросервисы и облачные решения — Azure, AWS, Docker, Kubernetes;
- Корпоративные системы — ERP, CRM, банковские приложения;
- Научные и инженерные вычисления — через библиотеки Math.NET, Accord.NET.
Экосистема C# включает:
- Visual Studio и Visual Studio Code — мощные IDE;
- NuGet — менеджер пакетов с миллионами библиотек;
- Entity Framework Core — ORM для работы с базами данных;
- xUnit, NUnit, MSTest — фреймворки для тестирования;
- Roslyn — компилятор как сервис, позволяющий анализировать и генерировать код.
Три основных правила эффективной работы с C#:
- Следовать принципам чистого кода — читаемость, минимальная связанность, тестируемость;
- Использовать современные возможности языка (начиная с C# 8.0) — nullable reference types, records, pattern matching, ranges;
- Применять асинхронное программирование там, где это уместно, избегая блокирующих вызовов.
Три фундаментальных момента:
- C# — это часть зрелой платформы с продуманной архитектурой и инструментарием;
- Его сила — в сочетании производительности, безопасности и удобства разработки;
- Знание внутренностей .NET (CLR, GC, JIT) критически важно для написания эффективного кода.
Куда идти дальше
| Тема | Раздел |
|---|---|
| "ASP.NET - веб-платформа Microsoft" | "ASP.NET - веб-платформа Microsoft" |
| "Веб-разработка и API на C#" | "Веб-разработка и API на C#" |
| "PHP — о разделе" | "PHP — о разделе" |
| "ASP.NET - фреймворк для веб-приложений" | "ASP.NET - фреймворк для веб-приложений" |
Проверьте себя: Чек-лист самопроверки.