Работа с каталогами и файлами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа с каталогами и файлами



В пространстве имен System. 10 есть четыре класса, предназначенные для работы с физическими файлами и структурой каталогов на диске: Directory, File, Directorylnfo и Filelnfo. С их помощью можно выполнять создание, удаление,перемещение файлов и каталогов, а также получение их свойств. Классы Directory и File реализуют свои функции через статические методы. Directorylnfo и Filelnfo обладают схожими возможностями, но они реализуются путем создания объектов соответствующих классов. Классы Directorylnfo и Filelnfo происходят от абстрактного класса FileSystemlnfo, который снабжает их базовыми свойствами.

Сохранение объектов (сериализация)

В С# есть возможность сохранять на внешних носителях не только данные примитивных типов, но и объекты. Сохранение объектов называется сериализацией, а восстановление сохраненных объектов — десериализацией. При сериализации объект преобразуется в линейную последовательность байтов. Это сложный процесс, поскольку объект может включать множество унаследованных полей и ссылки на вложенные объекты, которые, в свою очередь, тоже могут состоять из объектов сложной структуры. К счастью, сериализация выполняется автоматически, достаточно просто пометить класс как сериализуемый с помощью атрибута [Serial izable]. Атрибуты рассматриваются в главе 12, пока же достаточно знать, что атрибуты — это дополнительные сведения о классе, которые сохраняются в его метаданных. Те поля, которые сохранять не требуется, помечаются атрибутом [NonSerialized], например: [Serializable]

class Demo

{ public int a = 1:

[NonSerialized]

public double y:

public Monster X. Y; }

Объекты можно сохранять в одном из двух форматов: двоичном или SOA P (в виде XML-файла). В первом случае следует подключить к программе пространство имен System.Runtime.Serialization.Formatters.Binary, во втором — пространство System.Runtime.Seri alizati on.Formatters.Soap.

Рассмотрим сохранение объектов в двоичном формате. Для этого используется класс BinaryFormatter, в котором определены два метода:

Serialize(поток, объект);

DeserializeC поток):

Метод Serialize сохраняет заданный объект в заданном потоке, метод Deserialize восстанавливает объект из заданного потока.

Сборки, библиотеки, атрибуты, директивы

Сборки

В результате компиляции в среде.NET создается сборка — файл с расширением ехе или dll, который содержит код на промежуточном языке, метаданные типов, манифест и ресурсы. Компилятор в качестве результата своего выполнения создает так называемую сборку — файл с расширением ехе или dll, который содержит код на языке IL и метаданные. Метаданные представляют собой сведения об объектах, используемых в программе, а также сведения о самой сборке. Он и позволяют организовать межъязыковое взаимодействие, обеспечивают безопасность и облегчают развертывание приложений, то есть установку программ на компьютеры пользователей. Сборка может состоять из нескольких модулей. В любом случае она представляет собой программу, готовую для установки и не требующую для этого ни дополнительной информации, ни сложной последовательности действий. Каждая сборка имеет уникальное имя.

Метаданные типов — это сведения о типах, используемых в сборке. Компилятор создает метаданные автоматически. В них содержится информация о каждом типе, имеющемся в программе, и о каждом его элементе. Например, для каждого класса описываются все его поля, методы, свойства, события, базовые классы и интерфейсы. Среда выполнения использует метаданные для поиска определений типов и их элементов в сборке, для создания экземпляров объектов, проверки вызова методов и т. д. Компилятор, редактор кода и средства отладки также широко используют метаданные, например, для вывода подсказок и диагностических сообщений.

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

Создание библиотеки

Для создания библиотеки следует при разработке проекта в среде Visual Studio.NET выбрать шаблон Class Library (библиотека классов). В главе 8 была создана про стая иерархия классов персонажей компьютерной игры. В этом разделе мы оформим ее в виде библиотеки, то есть сборки с расширением dll.

Использование библиотеки

Любая библиотека — это сервер, предоставляющий свои ресурсы клиентам. Создадим клиентское приложение, выполняющее те же функции, что и приложение из раздела «Виртуальные методы» (см. с. 178), но с использованием библиотеки MonsterLib.dll. Для того чтобы компилятор мог ее обнаружить, необходимо после создания проекта (как обычно, это — консольное приложение) подключить ссылку на библиотеку с помощью команды Project Add Reference (Добавить ссылку). Для поиска каталога, содержащего библиотеку, следует использовать кнопку Browse. После подключения библиотеки можно пользоваться ее открытыми элементами таким же образом, как если бы они были описаны в том же модуле.

Рефлексия

Рефлексия — это получение информации о типах во время выполнения программы. Например, можно получить список всех классов и интерфейсов сборки, список элементов каждого из классов, список параметров каждого метода и т. д. Вся информация берется из метаданных сборки. Для использования рефлексии необходимы класс System.Туре и типы пространства имен System.Reflection. В классе Туре описаны методы, которые позволяют получить информацию о типах. В пространстве имен System.Reflection описаны типы, поддерживающие Туре, а также классы, которые служат для организации позднего связывания и динамической загрузки сборок.

Атрибуты

Атрибуты — это дополнительные сведения об элементах программы (классах, методах, параметрах и т. д.). С помощью атрибутов можно добавлять информацию в метаданные сборки и затем извлекать ее во время выполнения программы. Атрибут является специальным видом класса и происходит от базового класса System. Attribute. Атрибуты делятся на стандартные и пользовательские. В библиотеке.NET предусмотрено множество стандартных атрибутов, которые можно использовать в программах. Если всего разнообразия стандартных атрибутов не хватит, чтобы удовлетворить прихотливые требования программиста, он может описать собственные классы атрибутов, после чего применять их точно так же, как стандартные. При использовании (спецификации) атрибутов они задаются в секции атрибутов, располагаемой непосредственно перед элементом, для описания которого они предназначены. Секция заключается в квадратные скобки и может содержать несколько атрибутов, перечисляемых через запятую. Порядок следования атрибутов произвольный.

Обычно из контекста понятно, к какому элементу сборки относится атрибут, однако в некоторых случаях могут возникнуть неоднозначности. Для их устранения перед именем атрибута записывается тип элемента сборки — уточняющее ключевое слово, отделяемое от атрибута двоеточием. Ключевые слова и соответствующие элементы сборки, к которым могут относиться атрибуты.

Атрибут может иметь параметры. Они записываются в круглых скобках через запятую после имени атрибута и бывают позиционными и именованными. Именованный параметр указывается в форме имя = значение, для позиционного просто задается значение. Например, для использованного в следующем фрагменте кода атрибута CLSCompliant задан позиционный параметр true. Атрибуты, относящиеся к сборке, должны располагаться непосредственно после директив using, например:

using System;

[assembly:CLSCompliant(true)]

namespace ConsoleApplicationl

{...

Атрибуты уровня сборки хранятся в файле Assemblylnfo.cs, автоматически создаваемом средой для любого проекта. Для явного задания номера версии сборки можно записать атрибут [AssemblyVersion], например:

[assembly: AssemblyVersion("1.0.0.0")]

Пространства имен

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

• логического группирования элементов программы, расположенных в различных физических файлах;

• группирования имен, предоставляемых сборкой в пользование другим модулям.

Во всех программах, созданных ранее, использовалось пространство имен, создаваемое по умолчанию. Реальные программы чаще всего разрабатываются группой программистов, каждый из которых работает со своим набором физических файлов (единиц компиляции), хранящих элементы создаваемого приложения.

Если в разных файлах описать пространства имен с одним и тем же именем, то при построении приложения, состоящего из этих файлов, будет скомпоновано единое пространство имен.

Существует три способа использования типа, определенного в каком-либо пространстве имен:

1. Использовать полностью квалифицированное имя. Например, в пространстве имен System.Runtime.Serialization.Formatters.Binary описан класс BinaryFormatter. Создание объекта этого класса с помощью квалифицированного имени выглядит так:

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf =

new System.Runtime.Seri ali zati on.Formatters.Bi nary.Bi naryFormatter();

2. Использовать директиву using, с помощью которой импортируются все имен; из заданного пространства. В этом случае предыдущий пример примет вид, using System.Runtime.Serialization.Formatters.Binary;

BinaryFormatter bf = new BinaryFormatterO;

3. Использовать псевдоним типа. Это делается с помощью второй формы директивы using:

using BinF = System.Runtime.Seri ali zati on.Formatters.Bi nary.Bi naryFormatter; BinF bf.= new BinFO;

Первый способ применяется при однократном использовании имени типа «неглубоко» вложенных пространств имен, второй — в большинстве остальных случаев, что мы и делали во всех примерах, а третий можно рекомендовать многократном использовании длинного имени типа.

Директивы препроцессора

Препроцессором в языке С++ называется предварительный этап компиляции, формирующий окончательный вариант текста программы. В языке С#, потомке – С++, препроцессор практически отсутствует, но некоторые директивы сохранились. Назначение директив – исключать из процесса компиляции фрагменты кода при выполнении определенных условий, выводить сообщения об ошибках, предупреждения, а также структурировать код программы. Каждая директива располагается на отдельной строке и не заканчивается точкой запятой, в отличие от операторов языка. В одной строке с директивой может //располагаться только комментарий вида //.Рассмотрим более подробно применение директив условной компиляции. Они используются для того, чтобы исключить компиляцию отдельных частей программы. Это бывает полезно при отладке или, например, при поддержке нескольких версий программы для различных платформ.

Количество директив #elif произвольно. Исключаемые блоки кода могут содержать как описания, так и исполняемые операторы. Константное выражение может содержать одну или несколько символьных констант, объединенных знаками операций ==,! =,!, && и 11. Также допускаются круглые скобки. Константа считается равной true, если она была ранее определена с помощью директивы #define.

Директива #def i пе применяется не только в сочетании с директивами условной компиляции. Можно применять ее вместе со стандартным атрибутом Conditional для условного управления выполнением методов. Метод будет выполняться, если константа определена. Пример приведен в листинге 12.5. Обратите внимание на то, что для применения атрибута необходимо подключить пространство имен System.Diagnostics.



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 488; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.13.201 (0.015 с.)