Подключение пространств имен по умолчанию

Последнее обновление: 10.11.2021

Все классы существуют в некотором пространстве имен, и чтобы эти классы использовать, необходимо подключить их пространства имен, либо использовать полное название класса с указанием его пространства имен. Однако начиная с Visual Studio 2022 и .NET 6 и C# 10 мы можем просто в файле программы написать:

Console.WriteLine("Hello");

При этом не подключая явно пространство имен System, где располагается класс Console, тем не менее этот класс будет доступен, и мы его сможем использовать в любом файле кода C# в проекте. Дело в том, что начиная с .NET 6 в проекте по умолчанию подключается ряд наиболее часто используемых пространств имен, поэтому нам их не надо явно подключать. Эта настройка действует на уровне всего проекта. Так, откроем файл проекта. Для этого либо двойным кликом левой кнопкой мыши нажмем на проект, либо нажмем на проект правой кнопкой мыши и в появившемся меню выберем пункт Edit Project File

ImplicitUsings в C# в Visual Studio

После этого Visual Studio откроет нам файл проекта, который будет выглядеть примерно следующим образом:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Здесь строка

<ImplicitUsings>enable</ImplicitUsings>

точнее элемент <ImplicitUsings> задает подключение некоторого набора пространств имен по умолчанию. Значение enable указывает, что эта настройка будет применяться.

Если мы запустим проект на выполнение, то после компиляции проект в проекте в папке obj/Debug/net6.0 можно будет увидеть файл [Имя_проекта].GlobalUsings.g.cs (например, у меня проект называется HelloApp, соответственно файл будет называться HelloApp.GlobalUsings.g.cs). Если мы откроем этот файл, то увидим там следующее содержимое:

global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

Здесь перечислены все те пространства имен, которые подключаются в проект по умолчанию:

System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading
System.Threading.Tasks

Стоит отметить, что это набор пространств имен, которые подключаются в проект консольного приложения по умолчанию, у других типов проектов набор подключаемых пространств может отличаться.

Отключение пространств по умолчанию

В проектах, создаваемых в Visual Studio 2022 для .NET 6 и C# 10 эта возможность включена по умолчанию. Тем не менее при необходимости мы ее можем отключить. Для этого изменим эту настройку следующим образом:

<ImplicitUsings>disable</ImplicitUsings>

После этого Visual Studio 2022 подчеркнет нам класс Console, так как он нигде не определен в проекте, а его пространство имен не подключено:

ImplicitUsings в .NET 6 и C# 10 в Visual Studio 2022

В этом случае нам потребуется либо подключить пространство имен System, где располагается класс Console, либо использовать его полное имя:

using System;   // или подключить пространство System
Console.WriteLine("Hello world");

// или использовать полное имя класса
System.Console.WriteLine("Hello work");

Подключение и отключение пространств по отдельности

Вместо подключения по умолчанию некоторого набора пространств имен по умолчанию также можно подключать и отключать по отдельности пространств имен. Так, изменим файл проекта следующим образом:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  
  <ItemGroup>
    <Using Include="System" />
    <Using Include="System.Threading.Tasks" />
  </ItemGroup>
  
</Project>

Здесь атрибут Include элемента Using подключает пространства имен глобально по всему проекту. Например:

<Using Include="System" />

Подключает пространство System. Соответственно после этого нам не надо его подключать в файлы кода в проекте.

Обратная ситуация - отключение некоторых ненужных пространств имен из тех, которые подключаются по умолчанию. Для этого применяется атрибут Remove элемента Using:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  
  <ItemGroup>
    <Using Remove="System" />
    <Using Remove="System.Threading.Tasks"/>
  </ItemGroup>
  
</Project>

В данном случае отключаются пространства "System" и "System.Threading.Tasks"

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850