ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3149

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

using ClassLibrary; // Вам надо использовать эту библиотеку / / в программе

namespace ClassLibraryDriver

{

class Program

{

static void Main(string[] args)

{

//Создание объекта библиотеки и использование его

//методов

MyLibrary ml = new MyLibrary(); ml.LibraryFunctionl();

//Вызов статической функции посредством класса int nResult = MyLibrary.LibraryFunction2(27); Console . WriteLine (nResu-lt. ToString () ) ;

//Ожидаем подтверждения пользователя Console.WriteLine("Нажмите <Enter> для " +

"завершения программы.. . ") ;

Console.Read();

}

}

}

Вывод тестовой программы-драйвера, описанной в следующем разделе, выглядит следующим образом:

Это LibraryFunctionl()

Это LibraryFunction2(), возвращает 27 27

Нажмите <Enter> для завершения программы...

Библиотеки зачастую предоставляют только статические функции. В этом случае не нужно инстанцировать библиотечный объект — можно просто вызвать функцию по­ средством класса.

Создание проекта драйвера

Сама по себе библиотека классов не делает ничего, так что вам нужна программадрайвер, небольшая выполнимая программа, которая тестирует библиотеку в процессе разработки путем вызова ее методов. Для создания драйвера для проекта ClassLi­ brary выполните следующие действия.

1.Щелкните правой кнопкой мыши на имени решения в окне Solution Ex­ plorer проекта ClassLibrary и выберите Add : New Project.

Тем самым вы добавите проект в то же решение, в котором находится тестируе­ мая библиотека классов.

2.В диалоговом окне New Project выберите Console Application и назовите его ClassLibraryDriver или как вам заблагорассудится.

3.Находясь в диалоговом окне New Project, укажите местоположение про­ екта, щелкнув на кнопке Browse рядом с полем Location. Перейдите в папку, в которой вы хотите хранить проект драйвера, и щелкните на кнопке Open.

432

Часть VII. Дополнительные главы



Где именно вы расположите проект, зависит от того, как вы хотите организовать ваше решение. Вы можете поместить папку ClassLibraryDriver в той же общей папке, что и папку ClassLibrary, или вложить ее в папку ClassLi­ brary. Демонстрационная программа ClassLibrary в этом разделе придер­ живается первого подхода.

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

4.Щелкните на кнопке ОК для того, чтобы закрыть диалоговое окно New Project и создать проект.

Мастер Visual Studio АррWizard создаст папку проекта вместе с файлами проекта. В окне Solution Explorer вы увидите два проекта: ClassLibrary и ClassLi­ braryDriver.

5.Щелкните правой кнопкой мыши на проекте ClassLibraryDriver и вы­ берите в меню Set as Startup Project.

Тем самым вы указываете С#, где находится функция Main () для данного реше­ ния. Она должна находиться в сборке драйвера, но не в сборке библиотеки классов.

6.В файле Program, cs проекта ClassLibraryDriver добавьте в функцию Main () исходный текст наподобие приведенного:

MyLibrary myLib = new MyLibrary(); // Или что именно вы

// хотите вызывать

//вызов библиотечной функции myLib.LibraryFunctionl();

//Вызов статической функции

int result = MyLibrary.LibraryFunction2();

Другими словами, напишите программу, которая использует классы и методы из библиотеки. Вы уже сталкивались с этим ранее как в данной главе, так и в других главах книги — например, когда вызывали метод WriteLine () класса Con­ sole из библиотеки .NET Framework. (Console находится в пространстве имен

System в файле mscorlib . dll.)

Код примера библиотеки и драйвера приведен выше — см. листинг демонстраци­ онной программы ClassLibrary.

7.Выберите команду меню Projects Add Reference.

8.В диалоговом окне Add Reference щелкните на вкладке Projects. Выберите ваш проект ClassLibrary и щелкните на кнопке ОК.

Вы можете также добавить директиву using для пространства имен ClassLi­ brary в файл Program, cs проекта ClassLibraryDriver, чтобы сэконо­ мить на набираемом тексте.

Влюбой программе, которую вы напишете в будущем, достаточно включить дирек­ тиву using для пространства имен вашей библиотеки классов и добавить ссылку на

.DLL-файл, содержащий библиотеку, чтобы иметь возможность использовать библио­ течные классы в своей программе. Именно так программы в данной книге применяют классы из библиотеки .NET Framework.

Глава 19. Работа с файлами и библиотеками

433


Хранение данных в файлах

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

Классы для работы с файлами определены в пространстве имен System.IO. Базо вым классом для файлового ввода-вывода является класс FileStream. Для работы с файлом

программист должен его открыть. Команда open подготавливает файл

к работе и возвращает его дескриптор. Обычно дескриптор — это просто число, которое используется всякий раз при чтении из файла или записи в него.

Асинхронный ввод-вывод: есть ли что-то хуже ожидания?

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

Такой способ работы называется синхронным вводом-выводом.

Классы С# System.IO поддерживают также и асинхронный ввод-вывод. При ис­ пользовании асинхронного ввода-вывода вызов read () тут же вернет управление программе, позволяя ей заниматься чем-то еще, пока ее запрос на чтение данных из файла выполняется в фоновом режиме. Программа может проверить флаг выполнения запроса, чтобы узнать, завершено ли его выполнение.

Это чем-то напоминает варианты приготовления гамбургеров. При синхронном изго­ товлении вы нарезаете мясо и жарите его, после чего нарезаете лук и выполняете все остальные действия по приготовлению гамбургера. При асинхронном приготовлении вы начинаете жарить мясо, и, поглядывая на него, тут же, не дожидаясь готовности мяса, начинаете резать лук и делать все остальное.

Асинхронный ввод-вывод может существенно повысить производительность про­ граммы, но при этом вносит дополнительный уровень сложности.

С# использует более интуитивный подход. Он связывает каждый файл с объектом класса FileStream. Конструктор класса FileStream открывает файл, а методы FileStream выполняют операции ввода-вывода.

FileStream— не единственный класс, который может осуществлять файловый ввод-вывод. Однако он предоставляет хорошую основу для работы с файлами, выполняя 90% всех ваших нужд по работе с ними. Это корневой класс, описываемый в данном разделе. Он достаточно хорош для С# и для вас.

FileStream— фундаментальный класс. Весь набор его действий — это открытие фай­ ла, чтение и запись блока байтов. К счастью, пространство имен System.І0 содержит, по­ мимо прочего, следующий набор классов, которые обернуты вокруг FileStream и предос­ тавляют более простые и богатые возможности.

BinaryReader/BinaryWriter — пара потоковых классов, которые содержат методы для чтения и записи каждого из типов-значений: ReadChar (), Write-

434

Часть VII. Дополнительные главы


Char (), ReadByte (), WriteByte () и так далее. Эти классы полезны для чте­ ния и записи объекта в бинарном (не читаемом человеком) формате, в противопо­ ложность текстовому формату. Для работы с бинарными данными можно исполь­ зовать массив или коллекцию элементов типа Byte.

TextReader/TextWriter— пара классов для чтения символов (текста). Эти классы предоставляются в двух видах (наборах подклассов): StringReader/StringWriter и StreamReader/StreamWriter.

StringReader/StringWriter— простые потоковые классы, которые огра­ ничены чтением и записью строк. Они позволяют рассматривать строку как файл, предоставляя альтернативу доступу к символам строк с помощью записи с ис­ пользованием квадратных скобок ( [ ] ) , цикла foreach или методов класса

String наподобие Split (), Concatenate () и IndexOf ( ) . Вы считываете и записываете строки почти так же, как и файлы. Этот метод полезен для длинных файлов с сотнями или тысячами символов, которые вы хотите обработать вместе. Методы в этих классах аналогичны методам классов StreamReader и StreamWriter, описываемым далее.

StreamReader/StreamWriter

более интеллектуальные классы чтения

и записи текста. Например, класс

StreamWriter имеет метод WriteLine (),

очень похожий на метод класса Console. StreamReader имеет соответствую­ щий метод ReadLine () и очень удобный метод ReadToEnd ( ) , собирающий весь текстовый файл в одну группу и возвращающий считанные символы как строку string (которую вы можете затем использовать с классом StringReader, циклом foreach и тому подобным).

TextReader/TextWriter применяются как сами по себе, так и их более удобные подклассы, такие как StreamReader/StreamWriter.

В следующем разделе будут рассмотрены демонстрационные программы FileWrite и FileRead, которые иллюстрируют способы использования классов для тек­ стового ввода-вывода.

Использование Stream Writer

Программы генерируют два вида вывода.

Некоторые программы пишут блоки данных в виде байтов в чисто бинар­ ном формате. Этот тип вывода полезен для эффективного сохранения объ­ ектов (например, файл объектов Student, которые сохраняются между запусками программы в файле на диске).

Большинство программ читает и записывает информацию в виде текста, который может читать человек. Классы StreamWriter и StreamReader являются наиболее гибкими классами для работы с данными в таком виде.

Данные в удобном для чтения человеком виде ранее назывались ASCIIстроками, а сейчас — ANSI-строками. Эти два термина указывают названия организаций по стандартизации, которые определяют соответствующие стандарты. Однако кодировка ANSI работает только с латинским алфавитом

Глава 19. Работа с файлами и библиотеками

435