Язык программирования C#9 и платформа .NET5
Резюме
В главе был представлен обзор синтаксиса и семантики языка CIL. В отличие от управляемых языков более высокого уровня, таких как С#, в CIL не просто определяется набор ключевых слов, а предоставляются директивы (используемые для определения конструкции сборки и ее типов), атрибуты (дополнительно уточняющие данные директивы) и коды операций (применяемые для реализации членов типов).
Вы ознакомились с несколькими инструментами, связанными с программированием на CIL, и узнали, как изменять содержимое сборки .NET Core за счет добавления новых инструкций CIL, используя возвратное проектирование. Кроме того, вы изучили способы установления текущей (и ссылаемой) сборки, пространств имен, типов и членов. Был рассмотрен простой пример построения библиотеки кода и исполняемого файла .NET Core с применением CIL и соответствующих инструментов командной строки.
Наконец, вы получили начальное представление о процессе создания динамической сборки. Используя пространство имен
, сборку .NET Core можно определять в памяти во время выполнения. Вы видели, что работа с этим пространством имен требует знания семантики кода CIL. Хотя построение динамических сборок не является распространенной задачей при разработке большинства приложений .NET Core, оно может быть полезно в случае создания инструментов поддержки и различных утилит для программирования.System.Reflection.EmitЧасть VI
Работа с файлами, сериализация объектов и доступ к данным
Глава 20
Файловый ввод-вывод и сериализация объектов
При создании настольных приложений возможность сохранения информации между пользовательскими сеансами является привычным делом. В настоящей главе рассматривается несколько тем, касающихся ввода-вывода, с точки зрения платформы .NET Core. Первая задача связана с исследованием основных типов, определенных в пространстве имен
, с помощью которых можно программно модифицировать структуру каталогов и файлов. Вторая задача предусматривает изучение разнообразных способов чтения и записи символьных, двоичных, строковых и находящихся в памяти структур данных.System.IOПосле изучения способов манипулирования файлами и каталогами с использованием основных типов ввода-вывода вы ознакомитесь со связанной темой — сериализацией объектов. Сериализацию объектов можно применять для сохранения и извлечения состояния объекта с помощью любого типа, производного от
.System.IO.StreamНа заметку! Чтобы можно было успешно выполнять примеры в главе, IDE-среда Visual Studio должна быть запущена с правами администратора (для этого нужно просто щелкнуть правой кнопкой мыши на значке Visual Studio и выбрать в контекстном меню пункт Запуск от имени администратора). В противном случае при доступе к файловой системе компьютера могут возникать исключения, связанные с безопасностью.
Исследование пространства имен System.IO
В рамках платформы .NET Core пространство имен
представляет собой раздел библиотек базовых классов, выделенный службам файлового ввода и вывода, а также ввода и вывода в памяти. Подобно любому пространству имен внутриSystem.IOопределен набор классов, интерфейсов, перечислений, структур и делегатов, большинство из которых находятся в сборкеSystem.IO. В дополнение к типам, содержащимся внутриmscorlib.dll, в сборкеmscorlib.dllопределены дополнительные члены пространства именSystem.dll.System.IOМногие типы из пространства имен
сосредоточены на программной манипуляции физическими каталогами и файлами. Тем не менее, дополнительные типы предоставляют поддержку чтения и записи данных в строковые буферы, а также в области памяти. В табл. 20.1 кратко описаны основные (неабстрактные) классы, которые дают понятие о функциональности, доступной в пространстве именSystem.IO.System.IOВ дополнение к описанным конкретным классам внутри
определено несколько перечислений, а также набор абстрактных классов (скажем,System.IO,StreamиTextReader), которые формируют разделяемый полиморфный интерфейс для всех наследников. В главе вы узнаете о многих типах пространства именТехtWriter.System.IOКлассы Directory(Directorylnfо) и File(FileInfo)
Пространство имен
предлагает четыре класса, которые позволяют манипулировать индивидуальными файлами, а также взаимодействовать со структурой каталогов машины. Первые два класса,System.IOиDirectory, открывают доступ к операциям создания, удаления, копирования и перемещения через разнообразные статические члены. Тесно связанные с ними классыFileиFileInfoобеспечивают похожую функциональность в виде методов уровня экземпляра (следовательно, их экземпляры придется создавать с помощью ключевого словаDirectoryInfo). КлассыnewиDirectoryнепосредственно расширяют классFile, в то время какSystem.ObjectиDirectoryInfoявляются производными от абстрактного классаFileInfo.FileSystemInfoОбычно классы
иFileInfoсчитаются лучшим выбором для получения полных сведений о файле или каталоге (например, времени создания или возможности чтения/записи), т.к. их члены возвращают строго типизированные объекты. В отличие от них члены классовDirectoryInfoиDirectory, как правило, возвращают простые строковые значения, а не строго типизированные объекты. Тем не менее, это всего лишь рекомендация; во многих случаях одну и ту же работу можно делать с использованиемFileилиFile/FileInfo.Directory/DirectoryInfoАбстрактный базовый класс FileSystemInfo
Классы
иDirectoryInfoполучают многие линии поведения от абстрактного базового классаFileInfo. По большей части члены классаFileSystemInfoприменяются для выяснения общих характеристик (таких как время создания, разнообразные атрибуты и т.д.) заданного файла или каталога. В табл. 20.2 перечислены некоторые основные свойства, представляющие интерес.FileSystemInfo

