Директива using
Директива using позволяет использовать типы, определенные в пространстве имен, без указания полного пространства имен этого типа. В базовой форме директива using импортирует все типы из одного пространства имен, как показано в следующем примере:
using System.Text;
К директиве using можно применить два модификатора:
- Модификатор global действует так же, как и добавление одной директивы using к каждому исходному файлу в проекте. Впервые этот модификатор появился в C# 10.
- Модификатор static импортирует элементы static и вложенные типы из одного типа, а не из всех типов в пространстве имен.
Оба модификатора можно применить вместе для импорта статических членов из определенного типа во всех исходных файлах проекта.
Теперь можно также создать псевдоним для пространства имен или типа, используя директиву псевдонимов using.
using Project = PC.MyCompany.Project;
Модификатор global можно использовать в директиве using alias.
Ключевое слово using также используется для создания операторов using, которые помогают обеспечить правильную обработку объектов IDisposable, таких как файлы и шрифты. Дополнительные сведения об инструкции using см. в инструкции using.
Область директивы using без модификатора global ограничена файлом, в котором она находится.
Директива using может отображаться:
- В начале файла исходного кода перед объявлениями пространств имен и типов.
- В любом пространстве имен, но до любых пространств имен или типов, объявленных в этом пространстве имен, если только не используется модификатор global , если он используется, директива должна располагаться перед всеми объявлениями пространств имен и типов.
В противном случае возникнет ошибка компилятора CS1529.
Создайте директиву using , чтобы использовать типы в пространстве имен без необходимости указания этого пространства имен. Директива using не предоставляет доступ ни к одному из пространств имен, вложенных в указанное пространство имен. Пространства имен делятся на две категории: пользовательские и системные. Пользовательские пространства имен задаются в вашем коде. Список системных пространств имен см. в разделе Браузер API .NET.
Модификатор global
Добавление модификатора global к директиве using означает, что директива using должна применяться ко всем файлам в компиляции (обычно это проект). Директива global using впервые появилась в C# 10. Синтаксис:
global using ;
где fully-qualified-namespace — это полное доменное имя пространства имен, на типы которого можно ссылаться без указания пространства имен.
Директива global using может находиться в начале любого файла исходного кода. Все директивы global using в одном файле должны предшествовать:
- Всем директивам using без модификатора global .
- Всем объявлениям пространств имен и типов в файле.
Директивы global using можно добавлять в любой исходный файл. Как правило, их хранят в одном месте. Порядок директив global using не имеет значения ни в одном файле, ни в нескольких.
Модификатор global можно сочетать с модификатором static . Модификатор global может применяться к директиве using alias. В обоих случаях директива применяется ко всем файлам в текущей компиляции. Следующий пример включает использование всех методов, объявленных в System.Math во всех файлах проекта:
global using static System.Math;
Вы также можете включить пространства имен глобально, добавив элемент в файл проекта, например так: . Дополнительные сведения см. в разделе, посвященном элементу .
В шаблонах C# для .NET 6 используются операторы верхнего уровня. Приложение может не соответствовать коду в этой статье, если вы уже обновили его до .NET 6. Дополнительные сведения см. в статье Новые шаблоны C# для создания инструкций верхнего уровня.
Пакет SDK для .NET 6 также добавляет набор неявных global using директив для проектов, использующих следующие пакеты SDK:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Эти неявные директивы global using включают наиболее распространенные пространства имен для соответствующего типа проектов.
Дополнительные сведения см. в статье о неявных директивах using
статический модификатор
Директива using static указывает тип, доступ к статическим членам и вложенным типам которого можно получить, не указывая имя типа. Синтаксис:
using static ;
— это имя типа, на статические члены и вложенные типы которого можно ссылаться, не указывая имя типа. Если полное доменное имя (полное имя пространства имен вместе с именем типа) не указано, C# создает ошибку компилятора CS0246: «Тип или пространство имен ‘type/namespace’ не найдены (отсутствует директива using или ссылка сборки)».
Директива using static применяется к каждому типу, у которого есть статические члены (или вложенные типы), даже если при этом у него также имеются члены экземпляров. При этом для вызова членов экземпляров можно использовать только экземпляр типа.
Вы можете обращаться к статическим членам типа без необходимости квалификации доступа с помощью имени типа:
using static System.Console; using static System.Math; class Program < static void Main() < WriteLine(Sqrt(3*3 + 4*4)); >>
Обычно при вызове статического члена необходимо указать имя типа и имя нужного члена. Повторный ввод одного и того же имени типа для вызова относящихся к нему элементов может сделать код слишком длинным и сложным. Например, следующее определение класса Circle ссылается на многие члены класса Math.
using System; public class Circle < public Circle(double radius) < Radius = radius; >public double Radius < get; set; >public double Diameter < get < return 2 * Radius; >> public double Circumference < get < return 2 * Radius * Math.PI; >> public double Area < get < return Math.PI * Math.Pow(Radius, 2); >> >
Поскольку явно ссылаться на класс Math при каждой ссылке на член не требуется, директива using static создает более понятный код:
using System; using static System.Math; public class Circle < public Circle(double radius) < Radius = radius; >public double Radius < get; set; >public double Diameter < get < return 2 * Radius; >> public double Circumference < get < return 2 * Radius * PI; >> public double Area < get < return PI * Pow(Radius, 2); >> >
using static импортирует только доступные статические члены и вложенные типы, объявленные в указанном типе. Унаследованные члены не импортируются. Можно импортировать из любого именованного типа с помощью директивы using static , включая модули Visual Basic. Если функции F# верхнего уровня отображаются в метаданных как статические члены именованного типа, имя которого является допустимым идентификатором C#, то эти функции F# можно импортировать.
using static делает методы расширения, объявленные в указанном типе, доступными для поиска метода расширения. Тем не менее имена методов расширения не импортируются в область для неквалифицированной ссылки в коде.
Методы с тем же именем, импортированные из различных типов разными директивами using static в том же блоке компиляции или пространстве имен, формируют группу методов. Разрешение перегрузки в этих группах методов соответствует обычным правилам языка C#.
В следующем примере директива using static используется для того, чтобы доступ к статическим членам классов Console, Math и String можно было получать, не указывая имя типа.
using System; using static System.Console; using static System.Math; using static System.String; class Program < static void Main() < Write("Enter a circle's radius: "); var input = ReadLine(); if (!IsNullOrEmpty(input) && double.TryParse(input, out var radius)) < var c = new Circle(radius); string s = "\nInformation about the circle:\n"; s = s + Format(" Radius: \n", c.Radius); s = s + Format(" Diameter: \n", c.Diameter); s = s + Format(" Circumference: \n", c.Circumference); s = s + Format(" Area: \n", c.Area); WriteLine(s); > else < WriteLine("Invalid input. "); >> > public class Circle < public Circle(double radius) < Radius = radius; >public double Radius < get; set; >public double Diameter < get < return 2 * Radius; >> public double Circumference < get < return 2 * Radius * PI; >> public double Area < get < return PI * Pow(Radius, 2); >> > // The example displays the following output: // Enter a circle's radius: 12.45 // // Information about the circle: // Radius: 12.45 // Diameter: 24.90 // Circumference: 78.23 // Area: 486.95
В этом примере директива using static может также применяться к типу Double. Добавление этой директивы позволит вызывать метод TryParse(String, Double), не указывая имя типа. При этом, когда TryParse используется без указания имени типа, код становится менее понятным, поскольку появляется необходимость проверять директивы using static и определять, какой метод числового типа TryParse вызывается.
using static также применяется к типам enum . Если вы добавите using static с перечислением, в типе уже не обязательно использовать элементы перечисления.
using static Color; enum Color < Red, Green, Blue >class Program < public static void Main() < Color color = Green; >>
Псевдоним using
Создайте директиву псевдонима using , чтобы упростить квалификацию идентификатора для пространства имен или типа. Во всех директивах using следует использовать полное пространство имен или тип независимо от того, какие директивы using находятся перед ней. В объявлении директивы using не может использоваться псевдоним using . Например, следующий код вызывает ошибку компиляции:
using s = System.Text; using s.RegularExpressions; // Generates a compiler error.
В следующем примере показано, как задать и использовать псевдоним using для пространства имен.
namespace PC < // Define an alias for the nested namespace. using Project = PC.MyCompany.Project; class A < void M() < // Use the alias var mc = new Project.MyClass(); >> namespace MyCompany < namespace Project < public class MyClass < >> > >
Псевдоним using не может иметь открытый универсальный тип с правой стороны. Например, нельзя создать псевдоним using для List , но можно создать его для List .
В следующем примере показано, как задать директиву using и псевдоним using для класса.
using System; // Using alias directive for a class. using AliasToMyClass = NameSpace1.MyClass; // Using alias directive for a generic class. using UsingAlias = NameSpace2.MyClass; namespace NameSpace1 < public class MyClass < public override string ToString() < return "You are in NameSpace1.MyClass."; >> > namespace NameSpace2 < class MyClass < public override string ToString() < return "You are in NameSpace2.MyClass."; >> > namespace NameSpace3 < class MainClass < static void Main() < var instance1 = new AliasToMyClass(); Console.WriteLine(instance1); var instance2 = new UsingAlias(); Console.WriteLine(instance2); >> > // Output: // You are in NameSpace1.MyClass. // You are in NameSpace2.MyClass.
Начиная с C# 12, можно создать псевдонимы для типов, которые ранее были ограничены, включая типы кортежей, типы указателей и другие небезопасные типы. Дополнительные сведения об обновленных правилах см. в спецификации компонентов.
Использование пространства имен My из Visual Basic
Пространство имен Microsoft.VisualBasic.MyServices ( My в Visual Basic) обеспечивает простой и интуитивно понятный доступ к ряду классов .NET, позволяя создавать код, взаимодействующий с компьютером, приложением, параметрами, ресурсами и т. д. Пространство имен MyServices изначально разработано для Visual Basic, однако может применяться и в приложениях C#.
Дополнительные сведения об использовании пространства имен MyServices из Visual Basic см. в разделе Разработка с использованием пространства имен My.
Необходимо добавить ссылку на сборку Microsoft.VisualBasic.dll в проект. Некоторые классы из пространства имен MyServices нельзя вызывать из приложения C#, как, например, несовместимый класс FileSystemProxy. Конкретно в этом случае вместо него можно использовать статические методы из состава FileSystem (также входит в библиотеку VisualBasic.dll). Например, ниже показано, как дублировать каталог с помощью одного из таких методов:
// Duplicate a directory Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory( @"C:\original_directory", @"C:\copy_of_original_directory");
Спецификация языка C#
Дополнительные сведения см. в разделе Директивы using в статье Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Дополнительные сведения об использовании модификатора global using см. в спецификации функции global using — C# 10.
См. также
- справочник по C#
- Ключевые слова C#
- Пространства имен
- Правило стиля IDE0005 — удаление ненужных директив using
- Правило стиля IDE0065 — размещение директив using
- Инструкция using
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
System. Text Пространство имен
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Содержит классы, которые представляют кодировки ASCII и Юникода; абстрактные базовые классы для преобразования блоков знаков в блоки байтов и обратно; вспомогательный класс, который обрабатывает и форматирует объекты String, не создавая промежуточные экземпляры String.
Классы
Содержит классы, которые представляют кодировки ASCII и Юникода; абстрактные базовые классы для преобразования блоков знаков в блоки байтов и обратно; вспомогательный класс, который обрабатывает и форматирует объекты String, не создавая промежуточные экземпляры String.
Представляет кодировку ASCII символов Юникода.
Предоставляет доступ к поставщику кодировки для кодовых страниц, которые в противном случае доступны только в .NET Framework для настольных систем.
Представляет проанализированную строку составного формата.
Конвертирует последовательность закодированных байтов в набор символов.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, для закодированной входной последовательности байтов, которая не может быть преобразована во входной символ. Этот резервный механизм выдает исключение вместо декодирования входной последовательности байтов. Этот класс не наследуется.
Создает исключение DecoderFallbackException, если закодированная входная последовательность байтов не может быть преобразована в декодированный выходной символ. Этот класс не наследуется.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, закодированной входной последовательности байтов, которая не может быть преобразована в выходной символ.
Предоставляет буфер, позволяющий резервному обработчику возвращать в декодер альтернативную строку, если он не может декодировать входную последовательность байтов.
Исключение создается при сбое операции резервирования декодера. Этот класс не наследуется.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, закодированной входной последовательности байтов, которая не может быть преобразована в выходной символ. В резервном варианте вместо декодированной последовательности байтов выпускается заданная пользователем замещающая строка. Этот класс не наследуется.
Представляет заменяющую выходную строку, которая подставляется в случаях, когда не может быть декодирована первоначальная входная последовательность байтов. Этот класс не наследуется.
Конвертирует набор символов в последовательность байтов.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, для входного символа, который не может быть преобразован в выходную последовательность байтов. Резервный механизм создает исключение, если входной символ не может быть преобразован в закодированную выходную последовательность байтов. Этот класс не наследуется.
Создает исключение EncoderFallbackException, когда входной символ не может быть преобразован в закодированную выходную последовательность байтов. Этот класс не наследуется.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, для входного символа, который не может быть преобразован в выходную последовательность закодированных байтов.
Предоставляет буфер, позволяющий резервному обработчику возвращать в кодировщик альтернативную строку, если он не может закодировать входной символ.
Исключение, которое вызывается при сбое во время операции резервирования кодировщика. Этот класс не наследуется.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, для входного символа, который не может быть преобразован в выходную последовательность байтов. В резервном варианте вместо первоначального входного символа используется заданная пользователем замещающая строка. Этот класс не наследуется.
Представляет заменяющую входную строку, которая используется в случаях, когда входной символ не может быть декодирован. Этот класс не наследуется.
Представляет кодировку символов.
Предоставляет методы расширения для типов кодирования, такие как Encoding, Encoder и Decoder.
Предоставляет базовые сведения о кодировке.
Предоставляет базовый класс для поставщика кодировки, обеспечивающего кодировки, недоступные в определенной платформе.
Методы служебной программы redaction.
Предоставляет изменяемую строку символов. Этот класс не наследуется.
Представляет кодировку символов Юникода в формате UTF-16.
Представляет кодировку символов Юникода в формате UTF-32.
Представляет кодировку UTF-7 символов Юникода.
Представляет кодировку символов Юникода в формате UTF-8.
Структуры
Представляет скалярное значение Юникода ([U+0000.. U+D7FF] включительно или [U+E000..U+10FFFF] включительно).
Перечисляет строки объекта ReadOnlySpan .
Предоставляет перечислитель для значений Rune, представленных диапазоном текста в кодировке UTF-16.
Предоставляет обработчик, используемый компилятором языка для добавления интерполированных строк в StringBuilder экземпляры.
Поддерживает простую итерацию блоков экземпляра StringBuilder.
Предоставляет перечислитель для значений Rune, представленных строкой.
Перечисления
Определяет тип выполняемой нормализации.
Комментарии
Классы кодировки в первую очередь предназначены для преобразования между различными кодировками или кодовой страницей и кодировкой Юникода. Encoding.Unicode Кодировка UTF-16 используется внутри .NET, а Encoding.UTF8 кодирование часто используется для хранения символьных данных, чтобы обеспечить переносимость между компьютерами и языками и региональными параметрами.
Классы, производные от Encoding , позволяют выбрать резервную стратегию, которая определяет, как обрабатываются символы, которые не могут быть закодированы в последовательность байтов или байты, которые не могут быть декодированы в символы. Вы можете выбрать один из следующих вариантов:
- Откат исключения. Вы можете создавать исключения при ошибках данных с помощью флага, доступного throwonerror в некоторых конструкторах классов, или с помощью EncoderExceptionFallback классов и DecoderExceptionFallback . Если вас беспокоит целостность потока данных, рекомендуется создавать исключение.
- Резервная замена. Классы и DecoderFallback можно использовать EncoderFallback для автоматического изменения символа на «?» или на символ замены Юникода (U+FFFD).
- Наиболее подходящий резервный вариант. Этот параметр сопоставляет символ в одной кодировке с символом в другой кодировке. Резервный вариант с оптимальным подходом часто не рекомендуется, так как это может привести к потере данных и путанице и происходит медленнее, чем простая замена символов «?». Однако для кодовых страниц ANSI лучше всего подходит поведение по умолчанию.
Класс StringBuilder предназначен для операций, которые выполняют обширные манипуляции с одной строкой. String В отличие от класса, StringBuilder класс является изменяемым и обеспечивает лучшую производительность при сцепях или удалении строк.
Обратная связь
Были ли сведения на этой странице полезными?
Проблема с использованием System.Text.Json вместе с генератором исходного кода
Хотел из json файла нагенерировать C#-классов с помощью современного ISourceGenerator . Данные — массив блоков Minecraft. Всё бы ничего, но использование JsonSerizlizer.Deserialize постоянно вызывает следующую ошибку, в следствии которой мой генератор крашится:
Генератору "BlocksGenerator" не удалось создать источник. Это не повлияет на выходные данные и ошибки компиляции, которые могут возникнуть в результате. Тип возникшего исключения: "FileNotFoundException", сообщение: "Не удалось загрузить файл или сборку "Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" либо одну из их зависимостей. Не удается найти указанный файл."
У меня есть простейшее решение, структура такая:
- Minever.Data - Minever.Data.Core |-- IBlock.cs - Minever.Data.Generators |-- BlocksGenerators.Block.cs |-- BlocksGenerators.cs
GitHub проекта: https://github.com/iiKuzmychov/Minever.Data. BlocksGenerators.Block.cs:
using System.Text.Json.Serialization; namespace Minever.Data.Generators; public partial class BlocksGenerator < internal class Block < [JsonPropertyName("id")] public int Id < get; set; >[JsonPropertyName("name")] public string Name < get; set; >= default!; > >
BlocksGenerator.cs:
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; using Minever.Data.Core; using Minever.Data.Generators.Utils; using System.Diagnostics; using System.Text; using System.Text.Json; namespace Minever.Data.Generators; [Generator] public partial class BlocksGenerator : ISourceGenerator < public void Execute(GeneratorExecutionContext context) < var json = @"[ ]"; // json для теста var blocks = JsonSerializer.Deserialize(json)!; // в ЭТОЙ строке исключение var sourceBuilder = new StringBuilder(); sourceBuilder.AppendLine($"using ..;"); sourceBuilder.AppendLine(); sourceBuilder.AppendLine($"namespace ..Blocks;"); sourceBuilder.AppendLine(); foreach (var block in blocks) < sourceBuilder.AppendLine(GenerateBlockSourceCode(block)); sourceBuilder.AppendLine(); >context.AddSource("Blocks.g.cs", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8)); > public void Initialize(GeneratorInitializationContext context) < #if DEBUG if (!Debugger.IsAttached) Debugger.Launch(); #endif >private string GenerateBlockSourceCode(Block block) => $@"public class : > = ; public string > = ; >>"; >
Minever.Data.Generators.sln:
netstandard2.0 11.0 enable enable true true all runtime; build; native; contentfiles; analyzers; buildtransitive $(GetTargetPathDependsOn);GetDependencyTargetPaths
UPD: Попробовал изменить платформу генератора на .NET 7. После этого он перестал запускаться, в принципе, и имеется следующая ошибка:
Экземпляр анализатора Minever.Data.Generators.BlocksGenerator невозможно создать из D:\IT Projects\Other\Minever.Data\src\Minever.Data.Generators\bin\Debug\net7.0\Minever.Data.Generators.dll : Не удалось загрузить файл или сборку "System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их зависимостей. Не удается найти указанный файл."
Using system text c что это
Если мы хотим использовать какое-нибудь пространство имен в файлах кода в проекте, то по умолчанию нам надо его подключать во все файлы, где мы планируем его использовать.
Например, пусть у нас в проекте есть три файла с кодом:

В файле Base.cs определяется класс Company в пространстве Base :
namespace Base; class Company < string title; public Company(string title) =>this.title = title; public void Print() => Console.WriteLine($"Компания: "); >
В файле Person.cs определен класс Person, который использует класс Company:
using Base; class Person < string name; Company company; public Person(string name, Company company) < this.name = name; this.company = company; >public void Print() < Console.WriteLine($"Имя: "); company.Print(); > >
Чтобы использовать класс Company мы подключаем его пространство имен: using Base;
В классе Program.cs используются классы Person и Company:
using Base; Company microsoft = new("Microsoft"); Person tom = new("Tom", microsoft); tom.Print();
Опять же чтобы использовать класс Company, подключается его пространство имен: using Base;
И таких файлов, где надо подключать пространство Base (или какое-то другое) может быть множество. Это не очень удобно. И в .NET 6 для этого предложена концепция глобальных пространств имен , который подключаются один раз но сразу во все файлы кода в проекте. Для этого нам достаточно в одном файле прописать директиву:
global using подключаемое_пространство_имен;
Например, изменим файл Program.cs следующим образом:
global using Base; Company microsoft = new("Microsoft"); Person tom = new("Tom", microsoft); tom.Print();
Теперь пространство Base подключается во все файлы кода в проекте. И из файла Person.cs мы можем убрать строку
using Base;
Определение глобальных пространств в отдельном файле
Однако вышеуказанный подход опять же может быть не очень удобным, поскольку проще определить глобальные пространство имен, которые подключаются во весь проект где-то в одном месте. И для этого в Visual Studio 2022 мы можем добавить в проект новый файл с кодом C# и в нем определить набор подключаемых пространств имен. Например, добавим в проект файл, который назовем GlobalUsings.cs и в котором определим следующее содержимое:
global using System.Text; global using System.Reflection; global using Base;
И этот набор пространств имен будет автоматически подключаться во все файлы кода в проекте.