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

Платформа .NET — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Платформа .NET". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.

Вопрос. dotnet в терминале не найден после установки Visual Studio.

Ответ. Нужен .NET SDK, а не только runtime; перезапустите терминал после установки. Проверьте dotnet --list-sdks. Подробнее здесь — платформа .NET, оглавление.

Вопрос. Проект на .NET 8, а на машине только .NET 6 — "framework not found".

Ответ. Установите нужный SDK/runtime или опубликуйте self-contained с нужной версией. Сверьте TargetFramework в .csproj. Подробнее здесь — платформа .NET, архитектура.

Вопрос. .NET Framework 4.8 и современный .NET — в каком открывать чужой проект?

Ответ. Смотрите тип проекта в .csproj: net48 — Framework (Windows), net8.0 — современный .NET. Миграция между ними — отдельная задача, не "просто обновить VS". Подробнее здесь — история платформы, архитектура.

Вопрос. dotnet run собирает, но приложение сразу закрывается — окно мелькнуло.

Ответ. Консольное приложение завершилось (ошибка или конец Main). Запускайте из терминала или добавьте Console.ReadLine() для отладки. Подробнее здесь — платформа .NET, раздел C# — первая программа.

Вопрос. NuGet restore падает — "Unable to load the service index".

Ответ. Проверьте сеть, прокси, корпоративный firewall и источник пакетов в nuget.config. Временно очистите кэш: dotnet nuget locals all --clear. Подробнее здесь — платформа .NET, справочник API.

Вопрос. ASP.NET Core API отдаёт 404, Swagger открывается.

Ответ. Контроллер не зарегистрирован, неверный HTTP-метод или префикс маршрута [Route("api/[controller]")]. Сверьте URL в Swagger с тем, что вызывает клиент. Подробнее здесь — ASP.NET.

Вопрос. DI: сервис null или "Cannot resolve scoped service from singleton".

Ответ. Scoped нельзя напрямую внедрять в Singleton — используйте IServiceScopeFactory или измените lifetime. Регистрируйте интерфейс в Program.cs. Подробнее здесь — ASP.NET, архитектура.

Вопрос. async метод "висит" — deadlock в UI или ASP.NET (старый код).

Ответ. Классическая ловушка — .Result или .Wait() на UI-потоке с захватом контекста. Используйте await до конца, ConfigureAwait(false) в библиотеках. Подробнее здесь — F# async и task, раздел C#.

Вопрос. EF Core миграция применилась, таблиц в БД нет.

Ответ. Подключились к другой строке connection (LocalDB vs PostgreSQL), или EnsureDeleted в dev. Проверьте appsettings.Development.json и логи dotnet ef database update. Подробнее здесь — ADO.NET, EF Core в C#.

Вопрос. Nullable reference types включили — половина проекта в warning CS8602.

Ответ. Аннотации ? и проверки на null не магия — постепенно исправляйте или #nullable disable в legacy-файлах. Новый код пишите с учётом NRT. Подробнее здесь — архитектура, C#.

Вопрос. struct vs class — когда boxing "съел" производительность?

Ответ. Приведение struct к interface или object даёт boxing на кучу. Для горячих путей используйте generics с ограничением where T : struct. Подробнее здесь — архитектура и типы.

Вопрос. Equals и == дают разный результат для строк и своих классов.

Ответ. Для ссылочных типов без переопределения == — ссылки, Equals может быть переопределён. Для value types и string правила другие. Подробнее здесь — архитектура, C#.

Вопрос. dotnet publish на Linux, на сервере Windows — не запускается.

Ответ. Укажите RID: -r win-x64 или linux-x64, выберите self-contained vs framework-dependent. Подробнее здесь — платформа .NET.

Вопрос. Конфиг из appsettings.json не подхватывается в Production.

Ответ. ASP.NET Core загружает цепочку конфигов: базовый файл, appsettings.{Environment}.json, переменные окружения. Проверьте ASPNETCORE_ENVIRONMENT и переопределения в Docker/K8s. Подробнее здесь — ASP.NET.

Вопрос. Middleware "не срабатывает" — запрос проходит мимо.

Ответ. Порядок app.Use* критичен: ExceptionHandler до Routing, Authentication до Authorization. Новый middleware добавляйте в правильное место pipeline. Подробнее здесь — ASP.NET.

Вопрос. Blazor WASM грузится долго — первый заход "пустой экран" минуту.

Ответ. Клиент скачивает runtime и сборки .NET в браузер. Используйте lazy load, AOT где доступно, CDN и loading UI. Подробнее здесь — платформа .NET, оглавление.

Вопрос. F#: "The type X is not compatible with type Y" в pipeline |>.

Ответ. Проверьте порядок аргументов — pipe передаёт результат последним аргументом следующей функции. Часто помогает flip или промежуточная let. Подробнее здесь — первая программа F#, императивные конструкции.

Вопрос. F# файлы в проекте — "type already defined" при смене порядка.

Ответ. В F# порядок файлов в .fsproj задаёт порядок компиляции. Типы должны быть объявлены раньше использования. Подробнее здесь — структура F#-проекта.

Вопрос. C# и F# в одном solution — как вызывать код между языками?

Ответ. Через ссылку на проект и общие .NET-сборки; F# вызывает C# без обёрток, из C# в F# — через public API модулей. Подробнее здесь — F# в экосистеме, C# — о разделе.

Вопрос. System.Text.Json не сериализует private set — свойство пропало из JSON.

Ответ. По умолчанию сериализуются public get. Используйте [JsonInclude], DTO или Newtonsoft с другими правилами. Подробнее здесь — справочник API.

Вопрос. Docker-образ .NET раздувается до 2 GB — это нормально?

Ответ. Базовый SDK-образ тяжёлый. Для prod используйте multi-stage build и runtime-образ aspnet/runtime, publish trim/AOT где уместно. Подробнее здесь — платформа .NET.

Вопрос. xUnit тесты не видят internal классы основного проекта.

Ответ. Добавьте в основной проект InternalsVisibleTo("TestAssembly") или тестируйте через public API. Подробнее здесь — C#, вопросы на собеседование.

Вопрос. "Could not load file or assembly" после обновления NuGet-пакета.

Ответ. Конфликт версий транзитивных зависимостей. Проверьте dotnet list package --outdated, binding redirects в Framework или единый Central Package Management. Подробнее здесь — платформа .NET, справочник.

Вопрос. Kestrel слушает только localhost — с другого ПК API недоступен.

Ответ. По умолчанию dev-профиль привязан к 127.0.0.1. В launchSettings.json укажите applicationUrl с 0.0.0.0 или настройте reverse proxy. В prod — nginx/IIS перед Kestrel. Подробнее здесь — ASP.NET.

Вопрос. Учу C#, F# и VB одновременно в одном solution — путаница в синтаксисе.

Ответ. Платформа .NET мультиязычна, но новичку лучше один язык до первого working app — обычно C# или F# по маршруту в intro. Подробнее здесь — оглавление, F#, C#.

Вопрос. GC паузы "подлагивают" API — что смотреть первым?

Ответ. Включите dotnet-counters / dotnet-gcdump, проверьте LOH, частые аллокации в hot path, размер кэшей. Настройка GC — для prod после метрик. Подробнее здесь — платформа и CLR, архитектура.

Вопрос. Visual Studio и VS Code — разные версии SDK, проект собирается только в одной IDE.

Ответ. Сверьте global.json pin SDK и dotnet --version в обеих средах. Один репозиторий — один SDK через global.json или документируйте версию. Подробнее здесь — версии C# и .NET.

Частые поисковые запросы

Вопрос. .NET Framework, .NET Core и .NET — в чём разница?

Ответ. .NET Framework — legacy Windows-only; .NET Core — кроссплатформенное начало; .NET 5+ — единая платформа (8, 9, 10). Новые проекты — на современный .NET. Подробнее здесь — история, архитектура.

Вопрос. C# или F# — что учить на платформе .NET?

Ответ. C# — основной язык, больше вакансий и материалов; F# — функциональный стиль, data, DSL. Оба компилируются в один CLR. Подробнее здесь — F# в экосистеме, C# — intro.

Вопрос. ASP.NET Core — что это простыми словами?

Ответ. Кроссплатформенный веб-фреймворк для API, сайтов и MVC на .NET: Kestrel, middleware, DI, Razor/Minimal API. Подробнее здесь — ASP.NET, платформа .NET.

Вопрос. Entity Framework Core — tutorial для начинающих?

Ответ. EF Core — ORM для .NET: DbContext, миграции, LINQ к БД. Старт: модель → миграция → CRUD в сервисе. Подробнее здесь — EF Core в C#, ADO.NET.

Вопрос. .NET 8 LTS — стоит ли на него переходить?

Ответ. LTS-версии — долгая поддержка для prod; .NET 8 — стабильный выбор до следующего LTS. Сверьте таблицу версий и политику команды. Подробнее здесь — версии C# и .NET, история.

Вопрос. Kestrel в ASP.NET Core — что это?

Ответ. Встроенный веб-сервер .NET — принимает HTTP, передаёт в pipeline middleware. В prod часто за nginx/IIS; в dev слушает localhost. Подробнее здесь — ASP.NET.

Вопрос. Dependency Injection в .NET — как работает простыми словами?

Ответ. Контейнер создаёт и подставляет зависимости в конструктор (Transient/Scoped/Singleton). Регистрация в Program.cs, не new для сервисов. Подробнее здесь — ASP.NET, архитектура.

Вопрос. LINQ в C# — что это и зачем?

Ответ. Language Integrated Query — запросы к коллекциям и БД единым синтаксисом (Where, Select). Читаемее циклов для фильтрации и проекций. Подробнее здесь — C# — intro, справочник API.

Вопрос. Blazor — веб на C# без JavaScript?

Ответ. Blazor — UI на C# и Razor: WASM в браузере или Server через SignalR. JS всё ещё нужен для interop, но логика UI — на C#. Подробнее здесь — платформа .NET, оглавление.

Вопрос. Команды dotnet CLI — основные для новичка?

Ответ. dotnet new, dotnet build, dotnet run, dotnet test, dotnet publish, dotnet ef. SDK включает CLI для всего жизненного цикла. Подробнее здесь — платформа .NET.

Вопрос. NuGet — как установить пакет в .NET проект?

Ответ. dotnet add package ИмяПакета или через UI Visual Studio; версии фиксируются в .csproj. Аналог pip/npm для .NET. Подробнее здесь — платформа .NET, справочник.

Вопрос. .NET или Java — что выбрать для карьеры?

Ответ. Java — широкий enterprise-рынок; .NET — сильны Microsoft-стек, Azure, Windows-legacy и современный cross-platform. Оба LTS и востребованы. Подробнее здесь — intro .NET, Java — intro.

Вопрос. .NET MAUI — кроссплатформенные приложения?

Ответ. MAUI — один код для Windows, macOS, iOS, Android на C# и XAML (преемник Xamarin). Подробнее здесь — платформа .NET, оглавление.

Вопрос. async await Task в C# — как работает?

Ответ. async метод возвращает Task; await освобождает поток на I/O. Не блокируйте .Result на UI. Подробнее здесь — F# async и task, C#.

Вопрос. xUnit, NUnit или MSTest — что выбрать?

Ответ. xUnit — современный default в шаблонах .NET; NUnit и MSTest — legacy и enterprise. Для нового проекта — xUnit. Подробнее здесь — вопросы на собеседование.

Вопрос. dotnet publish self-contained — что это?

Ответ. Публикация с runtime внутри — на сервере не нужен установленный .NET; больше размер. Framework-dependent — меньше, но нужен runtime. Подробнее здесь — платформа .NET.

Вопрос. CLR и JIT в .NET простыми словами?

Ответ. CLR — среда выполнения (память, GC, типы); JIT компилирует CIL в машинный код при первом вызове метода. Подробнее здесь — платформа .NET, архитектура.

Вопрос. Visual Studio или VS Code для .NET разработки?

Ответ. Visual Studio — полный IDE для Windows/macOS с дизайнерами; VS Code + C# Dev Kit — легче, кроссплатформенно. Оба используют один SDK. Подробнее здесь — intro, версии VS и .NET.

Вопрос. Как создать REST API на ASP.NET Core с нуля?

Ответ. dotnet new webapi → контроллеры или Minimal API → DI сервисов → EF Core → Swagger. Подробнее здесь — ASP.NET, EF Core.

Вопрос. .NET в Docker — как контейнеризовать приложение?

Ответ. Multi-stage Dockerfile: SDK для build, runtime-образ для run; dotnet publish в контейнере. Подробнее здесь — платформа .NET.

Вопрос. record vs class vs struct в C# — когда что?

Ответ. class — ссылочный изменяемый тип; struct — value type на стеке; record — immutable data с value semantics. Подробнее здесь — C#, архитектура типов.

Вопрос. System.Text.Json или Newtonsoft.Json — что использовать?

Ответ. System.Text.Json — встроен, быстрее, default в ASP.NET Core; Newtonsoft — legacy и гибкие edge cases. Новые проекты — STJ. Подробнее здесь — справочник API.

Вопрос. Сколько учить C# и .NET до junior?

Ответ. C# синтаксис — 2–3 месяца; ASP.NET Core + SQL — ещё 4–6 с pet-проектом. Параллельно — Git и основы HTTP. Подробнее здесь — C# intro, чек-лист.

Вопрос. F# для начинающих — с чего начать на .NET?

Ответ. Обзор языка → первая консольная программа → FSI (REPL) → pattern matching → interop с C#. Подробнее здесь — F# в экосистеме, первая программа F#, FSI.


Что запомнить

Платформа .NET — это современная, кроссплатформенная и открытая экосистема для разработки приложений любого типа — от консольных утилит до веб-сервисов, мобильных приложений, микросервисов и облачных решений. Она объединяет в себе компиляторы, среду выполнения, библиотеки и инструменты, обеспечивая высокую производительность, безопасность и удобство разработки.

Основные компоненты платформы:

  • CLR (Common Language Runtime) — среда выполнения, управляющая памятью, безопасностью, исключениями и жизненным циклом объектов;
  • CIL (Common Intermediate Language) — промежуточный язык, в который транслируется исходный код на этапе компиляции;
  • JIT-компилятор — компонент, преобразующий CIL в машинный код непосредственно перед выполнением;
  • BCL (Base Class Library) — стандартная библиотека, предоставляющая классы для работы с файлами, сетью, коллекциями, датами, строками и многим другим;
  • NuGet — система управления пакетами, позволяющая подключать сторонние и официальные библиотеки;
  • SDK и CLI (dotnet) — набор инструментов командной строки для создания, сборки, тестирования и публикации проектов.

Эволюция платформы прошла три ключевых этапа:

  1. .NET Framework — Windows-only, закрытый, исторически первый;
  2. .NET Core — кроссплатформенный, модульный, открытый;
  3. .NET 5+ — единая унифицированная платформа, объединившая лучшие черты предшественников.

Современный .NET поддерживает множество типов приложений:

  • ASP.NET Core — для веб-приложений и API;
  • WinForms / WPF — для классического desktop UI на Windows; примеры с разбором (Lab);
  • MAUI — для кроссплатформенных десктопных и мобильных приложений;
  • Blazor — для интерактивных веб-интерфейсов на C#;
  • gRPC, SignalR, Minimal APIs — для современных сервисов и интеграций.

Три основных правила эффективной работы с .NET:

  1. Использовать последнюю LTS-версию платформы для стабильности и поддержки;
  2. Следовать принципам чистой архитектуры, внедрения зависимостей и асинхронного программирования;
  3. Активно применять инструменты диагностики, логирования и мониторинга (Application Insights, Serilog, OpenTelemetry).

Три фундаментальных момента:

  • .NET — это не только язык C#, но и целая платформа с поддержкой F#, visual-basic и других языков;
  • Архитектура .NET построена на принципах безопасности, изоляции и управляемого выполнения;
  • Экосистема .NET активно развивается, включая облачные интеграции с Azure, поддержку контейнеров и Kubernetes.

Куда идти дальше

ТемаРаздел
"Java — о разделе""Java — о разделе"
"C# — о разделе""C# — о разделе"
"Python — о разделе""Python — о разделе"
"C++ — о разделе""C++ — о разделе"
Десктоп WinForms / WPFWindows Forms (WinForms), Первая форма WPF — XAML, стили и шаблоны, галерея (Lab)

Проверьте себя: Чек-лист самопроверки.