шпоргалка исис. Билет 1. Платформа Microsoft. Net Framework 0
Скачать 151.37 Kb.
|
Работа с файлами Класс Filelnfo Класс Filelnfo предназначен для организации доступа к физическому файлу, который содержится на жестком диске компьютера. Он позволяет получать информацию об этом файле (например, о времени его создания, размере, атрибутах и т. п.), а также производить различные операции, например, по созданию файла или его удалению. Класс FileInfo наследует члены класса FileSystemInfo и содержит дополнительный набор членов, Как мы видим, большинство методов FileInfo возвращает объекты (FIleStream, StreamWriter, StreamReader и т. п.), которые позволяют различным образом взаимодействовать с файлом, например, производить чтение или запись в него. Класс File Доступ к физическим файлам можно получать и через статические методы класса File. Большинство методов объекта Fileinfo представляют в этом смысле зеркальное отражение методов объекта File. Билет №14. Обработка исключений: операторы try, checked и unchecked. Генерация собственных исключений. Язык С#, как и многие другие объектно-ориентированные языки, реагирует на ошибки и ненормальные ситуации с помощью механизма обработки исключений. Исключение - это объект, генерирующий информацию о «необычном программном происшествии». При этом важно проводить различие между ошибкой в программе, ошибочной ситуацией и исключительной ситуаций. Ошибка в программе допускается программистом при ее разработке Ошибочная ситуация вызвана действиями пользователя Даже если программист исправил все свои ошибки в программе, предвидел все ошибочные ситуации, он все равно может столкнуться с непредсказуемыми и неотвратимыми проблемами - исключительными ситуациями. Для обработки ошибочных и исключительных ситуаций в С# используется специальная подсистема обработки исключений. Преимущество данной подсистемы состоит в автоматизации создания большей части кода по обработке исключений. Раньше этот код приходилось вводить в программу "вручную". Кроме этого обработчик исключений способен распознавать и выдавать информацию о таких стандартных исключениях, как деление на нуль или попадание вне диапазона определения индекса. Оператор try В С# исключения представляются классами. Все классы исключений порождены от встроенного класса исключений Exception, который определен в пространстве имен System. Управление обработкой исключений основывается на использовании оператора try. Синтаксис оператора: try // контролируемый блок { … } catch //один или несколько блоков обработки исключений { … } finally //блок завершения { … } Программные инструкции, которые нужно проконтролировать на предмет исключений, помещаются в блок try. Если исключение возникает в этом блоке, оно дает знать о себе выбросом определенного рода информации. Выброшенная информация может быть перехвачена и обработана соответствующим образом с помощью блока catch. Любой код, который должен быть обязательно выполнен при выходе из блока try, помещается в блок finally. Операторы checked и unchecked В С# предусмотрено специальное средство, которое связано с генерированием исключений, вызванных переполнением результата в арифметических вычислениях. Например, когда значение арифметического выражения выходит за пределы диапазона, определенного для типа данных выражения. Для управления подобными исключениями в С# используются операторы checked и unchecked. Чтобы указать, что некоторое выражение должно быть проконтролировано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал типу-результату выражения. Оператор checked имеет две формы:
checked ((тип-выражения) expr) где expr — выражение, значение которого необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException.
checked { // Инструкции, подлежащие проверке. } Оператор unchecked также имеет две формы: 1) операторная форма, которая позволяет игнорировать переполнение для заданного выражения unchecked ((тип-выражения) expr) где ехрr— выражение, которое не проверяется на предмет переполнения. В случае переполнения это выражение усекается. 2) игнорирует переполнение, которое возможно в блоке инструкций unchecked { // Инструкции, для которых переполнение игнорируется. } Генерация собственных исключений До сих пор мы рассматривали исключения, которые генерирует среда, но сгенерировать исключение может и сам программист. Для этого необходимо воспользоваться оператором throw, указавпараметры, определяющие вид исключения. Параметром должен быть объект, порожденный от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении обработчику. При генерации исключения можно определить сообщение, которое будет «выбрасываться» обработчиком исключений. Билет №15. Организация С#-системы ввода-вывода: стандартные, байтовые, символьные и двоичные потоки данных Организация С#-системы ввода-вывода С#-программы выполняют операции ввода-вывода посредством потоков, которые построены на иерархии классов. Поток (stream) — это абстракция, которая генерирует и принимает данные. С помощью потока можно читать данные из различных источников (клавиатура, файл) и записывать в различные источники (принтер, экран, файл). Центральную часть потоковой С#-системы занимает класс Stream пространства имен System.IO. Класс Stream представляет байтовый поток и является базовым для всех остальных потоковых классов. Из класса Stream выведены такие байтовые классы потоков как: 1) FileStream - байтовый поток, разработанный для файлового ввода-вывода 2) BufferedStream - заключает в оболочку байтовый поток и добавляет буферизацию, которая во многих случаях увеличивает производительность программы;
Байтовый поток Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream. При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи: FileStream(string filename, FileMode mode) где: 1) параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта. 2) параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode:
Другая версия конструктора позволяет ограничить доступ только чтением или только записью: FileStream(string filename, FileMode mode, FileAccess how) где:
1) FileAccess.Read – только чтение; 2) FileAccess.Write – только запись; 3) FileAccess.ReadWrite - и чтение, и запись. После установления связи байтового потока с физическим файлом внутренний указатель потока устанавливается на начальный байт файла. Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte(). После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достинут конец файла, то метод ReadByte() возвращает значение -1. Для побайтовой записи данных в поток используется метод WriteByte(). По завершении работы с файлом его необходимо закрыть. Для этого достаточно вызвать метод Close (). При закрытии файла освобождаются системные ресурсы, ранее выделенные для этого файла, что дает возможность использовать их для работы с другими файлами. Символьный поток Чтобы создать символьный поток нужно поместить объект класса Stream (например, FileStream) «внутрь» объекта класса StreamWriter или объекта класса StreamReader. В этом случае байтовый поток будет автоматически преобразовываться в символьный. Классе StreamWriter предназначен для организации выходного символьного потока. В нем определено несколько конструкторов. Один из них записывается следующим образом: StreamWriter(Stream stream); где параметр stream определяет имя уже открытого байтового потока. Например, создать экземпляр класса StreamWriter можно следующим образом: StreamWriter fileOut=new StreamWriter(new FileStream("text.txt", FileMode.Create, FileAccess.Write)); Другой вид конструктора позволяет открыть поток сразу через обращения к файлу: StreamWriter(string name); где параметр name определяет имя открываемого файла. Например, обратиться к данному конструктору можно следующим образом: StreamWriter fileOut=new StreamWriter("c:\temp\t.txt"); И еще один вариант конструктора StreamWriter: StreamWriter(string name, bool appendFlag); где параметр name определяет имя открываемого файла; параметр appendFlag может принимать значение true – если нужно добавлять данные в конец файла, или false – если файл необходимо перезаписать. Например: StreamWriter fileOut=new StreamWriter("t.txt", true); Теперь для записи данных в поток fileOut можно обратиться к методу WriteLine. Это можно сделать следующим образом: fileOut.WriteLine("test"); В данном случае в конец файла t.txt будет дописано слово test. Класс StreamReader предназначен для организации входного символьного потока. Один из его конструкторов выглядит следующим образом: StreamReader(Stream stream); где параметр stream определяет имя уже открытого байтового потока. Этот конструктор генерирует исключение типа ArgumentException, если поток stream не открыт для ввода. Например, создать экземпляр класса StreamWriter можно следующим образом: StreamReader fileIn = new StreamReader(new FileStream("text.txt", FileMode.Open, FileAccess.Read)); Как и в случае с классом StreamWriter у класса StreamReader есть и другой вид конструктора, который позволяет открыть файл напрямую: StreamReader (string name); где параметр name определяет имя открываемого файла. Обратиться к данному конструктору можно следующим образом: StreamReader fileIn=new StreamReader ("c:\temp\t.txt"); Двоичные потоки Двоичные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть во внутреннем представлении. Двоичные файлы не применяются для просмотра человеком, они используются только для программной обработки. Выходной поток BinaryWriter поддерживает произвольный доступ, т.е. имеется возможность выполнять запись в произвольную позицию двоичного файла. Билет №19. Данные классов: поля и константы Данные: поля и константы Данные, содержащиеся в классе, могут быть переменными или константами. При описании данных также можно указывать атрибуты и спецификаторы, задающие различные характеристики элементов. Синтаксис описания элемента данных приведен ниже: [атрибуты] [спецификаторы] [const] тип имя [ = начальное_значение ] Рассмотрим возможные спецификаторы для данных:
Для констант можно использовать только спецификаторы 1-6. По умолчанию элементы класса считаются закрытыми private. Для полей класса этот вид доступа является предпочтительным, поскольку поля определяют внутреннее строение класса, которое должно быть скрыто от пользователя. Все методы класса имеют непосредственный доступ к его закрытым полям. Поля, описанные со спецификатором static, а также константы существуют в единственном экземпляре для всех объектов класса, поэтому к ним обращаются не через имя экземпляра, а через имя класса. Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полей или имя класса для статических. Билет №17. Технология объектно-ориентированного программирования Технология объектно-ориентированного программирования В основе языка С# лежит технология объектно-ориентированного программирования (ООП). Все программы на языке С# в большей или меньшей степени являются объектно-ориентированными, поэтому, приступая к написанию даже самой простой программы, нужно познакомиться с основными понятиями в рамках ООП. ООП основано на таких понятиях как «класс», «объект», «интерфейс», «инкапсуляция», «наследование», «полиморфизм», «событие». Объект в программе — этоабстракция реального объекта. Объект обладает атрибутами, поведением и индивидуальностью. Атрибуты определяют основные черты объекта, поведение — действия над объектом, индивидуальность — отличие одного объекта от другого с такими же атрибутами по их конкретным значениям. Например: два кота, у обоих есть шерсть, но у одного шерсть черного цвета, у другого — рыжая. Класс – это множество объектов с одинаковыми атрибутами и поведением, представляемое в языке программирования в виде абстрактного типа данных, который включает в себя члены класса. Рассмотрим некоторые из них:
Класс служит образцом для создания объектов или, другими словами, объект является экземпляром класса. Важным свойством объекта является его обособленность Детали реализации объекта, то есть внутренние структуры данных и алгоритмы их обработки, скрыты от пользователя и недоступны для непреднамеренного изменения. Объект используется через его интерфейс - совокупность правил доступа. Скрытие деталей реализации называется инкапсуляцией. В ООП данные и методы одного класса могут передаваться другим классам с помощью механизма наследования. Порожденный класс (потомок), наследующий характеристики другого класса, обладает теми же возможностями, что и класс (предок), от которого он порожден. При этом класс-предок остается без изменения, а классу-потомку можно добавлять новые элементы (поля, методы, свойства) или изменять унаследованные методы. Благодаря этому класс-потомок обладает большими возможностями, чем предок. Так, например, все классы (а их очень много и с некоторыми из них мы познакомимся чуть позже) порождены от корневого класса System.Object. Классы-потомки некоторого класса являются разновидностями этого класса-предка. (Другими словами, класс-предок является обобщением своих потомков). Это означает, что к объектам классов-потомков можно обращаться с помощью одного и того же имени (но при этом могут выполняться различные действия) — что составляет суть полиморфизма. Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов, который мы рассмотрим позднее. Программу, построенную на принципах ООП, можно представить как совокупность взаимодействующих объектов. Объект А воздействует на объект Б, и для Б возникает событие, на которое Б отреагирует либо ответным воздействием на А, либо воздействием на объект В. Если А — внешний для системы объект, то Б — интерфейсный объект (отвечающий за взаимодействие системы с внешним миром). Операционная система Windows — объектно-ориентированная система, в которой определены классы для производства объектов, обеспечивающих, в частности, интерфейс с пользователем. Программа, написанная под Windows, обращается к ней, командуя какой интерфейсный объект на каком именно месте создать — так строится внешний вид (интерфейс) программы. Эти интерфейсные объекты кажутся принадлежащими программе, но на самом деле они — часть Windows: именно она отвечает за их базовый внешний вид и поведение. Поэтому, когда пользователь воздействует на интерфейсный объект программы (нажимает кнопку, выбирает пункт меню и т.п.), для этого объекта происходит событие и Windows переводит это событие в сообщение для программы. При написании программы предусматривается однозначная реакция на это сообщение в виде метода, а в методе вызываются методы других объектов. Т.е. воздействие на интерфейсный объект приводит к появлению в недрах Windows сообщения, которое, приходя в программу, запускает цепочку взаимодействий внутренних для нее объектов. Таким образом, ООП программа фактически встраивается в ОС Windows. |