TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.78K subscribers
Post #1199 1.39K
День девятьсот семьдесят седьмой. #ЧтоНовенького
Неявные Директивы Using в .NET 6
Недавно мы говорили о возможности использовать global using в C #10. Так почему бы не включать эту функцию сразу же при создании нового проекта в .NET 6? Если вы создаёте новый веб-проект, появляется много автоматически сгенерированных как часть шаблона файлов. Логично было бы явно создавать файл GlobalUsings.cs, верно?

В .NET 6 решили проблему немного по-другому. Новый функционал неявных директив using создаёт скрытый автоматически сгенерированный файл внутри папки obj, который за кулисами объявляет глобальные директивы using. После сборки проекта в obj/Debug/net6.0 появится файл
<имя_проекта>.ImplicitNamespaceImports.cs, со примерно таким содержимым:
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
…

Заметьте, что т.к. это автоматически созданный файл, мы не можем его здесь редактировать. Но мы видим, что он объявляет за нас целую кучу глобальных директив using. Каждый тип проекта будет иметь свой набор глобальных директив. Например, в веб проект добавятся
System.Net.Http.Json
Microsoft.AspNetCore.Hosting
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
и т.п.

Если мы попытаемся импортировать пространство имен, которое уже есть в этом файле, мы получим обычное предупреждение:
CS0105: The using directive for 'System' appeared previously in this namespace

Отключение
Если вы используете .NET 6 и C #10, то эта функция включена по умолчанию. Но что, если вы захотите отключить её? Это может быть полезно, если автоматически импортируемое пространство имён имеет тип, который конфликтует с типом, который вы сами хотите объявить. Это можно сделать в файле .csproj. Можно либо отключить функцию полностью:
<PropertyGroup>
…
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
</PropertyGroup>

Либо выбрать, какие пространства имён включать, а какие нет:
<ItemGroup>
<Import Remove="System.Threading" />
<Import Include="Microsoft.Extensions.Logging" />
</ItemGroup>

Это также может быть заменой обсуждённому в предыдущем посте файлу GlobalUsings.cs, но в этом варианте, в недрах файла .csproj, это более «скрыто».

Это хорошая функция?
Сложно сказать. Придумывали её люди намного умнее меня, и наверняка они знают, что делают. Когда появлялись такие вещи, как дженерики, лямбда-выражения, async/await, они тоже были непривычны и непонятны.

С одной стороны, мне нравится, что каждый тип проекта имеет свой набор подключённых по умолчанию пространств имён. Если вы, например, активно используете async/await, то импорт System.Threading.Tasks потребуется чуть ли не в каждом файле, поскольку ваши методы должны возвращать тип Task.

При этом настораживает «скрытая» сущность функционала. Я почти уверен, что StackOverflow будет переполнен вопросами, почему компилятор говорит, что System уже импортирован, хотя его импорта нигде не найти. Кроме того, после обновления существующего решения с .NET 5 на .NET 6 функция автоматически включится… ну такое.

При этом, может быть, через годы мы просто привыкнем к этому, и это просто станет «частью .NET», как и многие другие вещи. Что думаете?

Источник: https://dotnetcoretutorials.com/2021/08/31/implicit-using-statements-in-net-6/
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →