шпоргалка исис. Билет 1. Платформа Microsoft. Net Framework 0
Скачать 0.77 Mb.
|
Генерация собственных исключений До сих пор мы рассматривали исключения, которые генерирует среда, но сгенерировать исключение может и сам программист. Для этого необходимо воспользоваться оператором throw, указавпараметры, определяющие вид исключения. Параметром должен быть объект, порожденный от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении обработчику. При генерации исключения можно определить сообщение, которое будет «выбрасываться» обработчиком исключений. Билет №15. Организация С#-системы ввода-вывода: стандартные, байтовые, символьные и двоичные потоки данных Организация С#-системы ввода-вывода С#-программы выполняют операции ввода-вывода посредством потоков, которые построены на иерархии классов. Поток (stream) — это абстракция, которая генерирует и принимает данные. С помощью потока можно читать данные из различных источников (клавиатура, файл) и записывать в различные источники (принтер, экран, файл). Центральную часть потоковой С#-системы занимает класс Stream пространства имен System.IO. Класс Stream представляет байтовый поток и является базовым для всех остальных потоковых классов. Из класса Stream выведены такие байтовые классы потоков как: 1) FileStream - байтовый поток, разработанный для файлового ввода-вывода 2) BufferedStream - заключает в оболочку байтовый поток и добавляет буферизацию, которая во многих случаях увеличивает производительность программы; 3) MemoryStream - байтовый поток, который использует память для хранения данных. Байтовый поток Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream. При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи: FileStream(string filename, FileMode mode) где: 1) параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта. 2) параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode: FileMode.Append - предназначен для добавления данных в конец файла; FileMode.Create – предназначен для создания нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален; FileMode.CreateNew - предназначен для создания нового файла, при этом файл с таким же именем не должен существовать; FileMоde.Open - предназначен для открытия существующего файла; FileMode.ОpenOrCreate - если файл существует, то открывает его, в противном случае создает новый FileMode.Truncate - открывает существующий файл, но усекает его длину до нуля Другая версия конструктора позволяет ограничить доступ только чтением или только записью: FileStream(string filename, FileMode mode, FileAccess how) где: 1. параметры filename и mode имеют то же назначение, что и в предыдущей версии конструктора; 2. параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess: 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. new Новое описание поля, скрывающее унаследованный элемент класса 2. public Доступ к элементу не ограничен 3. protected Доступ только из данного и производных классов 4. internal Доступ только из данной сборки 5. protected internal Доступ только из данного и производных классов и из данной сборки 6. private Доступ только из данного класса 7. static Одно поле для всех экземпляров класса 8. readonly Поле доступно только для чтения (значение таких полей можно установить либо при описании, либо в конструкторе) 9. volatile Поле может изменяться другим процессом или системой Для констант можно использовать только спецификаторы 1-6. По умолчанию элементы класса считаются закрытыми private. Для полей класса этот вид доступа является предпочтительным, поскольку поля определяют внутреннее строение класса, которое должно быть скрыто от пользователя. Все методы класса имеют непосредственный доступ к его закрытым полям. Поля, описанные со спецификатором static, а также константы существуют в един ственном экземпляре для всех объектов класса, поэтому к ним обращаются не через имя экземпляра, а через имя класса. Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полей или имя класса для статических. Билет №17. Технология объектно-ориентированного программирования Технология объектно-ориентированного программирования В основе языка С# лежит технология объектно-ориентированного программирования (ООП). Все программы на языке С# в большей или меньшей степени являются объектно-ориентированными, поэтому, приступая к написанию даже самой простой программы, нужно познакомиться с основными понятиями в рамках ООП. ООП основано на таких понятиях как «класс», «объект», «интерфейс», «инкапсуляция», «наследование», «полиморфизм», «событие». Объект в программе — этоабстракция реального объекта. Объект обладает атрибутами, поведением и индивидуальностью. Атрибуты определяют основные черты объекта, поведение — действия над объектом, индивидуальность — отличие одного объекта от другого с такими же атрибутами по их конкретным значениям. Например: два кота, у обоих есть шерсть, но у одного шерсть черного цвета, у другого — рыжая. Класс – это множество объектов с одинаковыми атрибутами и поведением, представляемое в языке программирования в виде абстрактного типа данных, который включает в себя члены класса. Рассмотрим некоторые из них: поля – непосредственно данные определенного типа для описания атрибутов; методы - функции, предназначенные для обработки внутренних данных объекта данного класса; свойства – это специальные поля данных, с помощью которых, можно управлять поведением объектов данного класса. Класс служит образцом для создания объектов или, другими словами, объект является экземпляром класса. Важным свойством объекта является его обособленность Детали реализации объекта, то есть внутренние структуры данных и алгоритмы их обработки, скрыты от пользователя и недоступны для непреднамеренного изменения. Объект используется через его интерфейс - совокупность правил доступа. Скрытие деталей реализации называется инкапсуляцией. В ООП данные и методы одного класса могут передаваться другим классам с помощью механизма наследования. Порожденный класс (потомок), наследующий характеристики другого класса, обладает теми же возможностями, что и класс (предок), от которого он порожден. При этом класс-предок остается без изменения, а классу-потомку можно добавлять новые элементы (поля, методы, свойства) или изменять унаследованные методы. Благодаря этому класс-потомок обладает большими возможностями, чем предок. Так, например, все классы (а их очень много и с некоторыми из них мы познакомимся чуть позже) порождены от корневого класса System.Object. Классы-потомки некоторого класса являются разновидностями этого класса-предка. (Другими словами, класс-предок является обобщением своих потомков). Это означает, что к объектам классов- потомков можно обращаться с помощью одного и того же имени (но при этом могут выполняться различные действия) — что составляет суть полиморфизма. Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов, который мы рассмотрим позднее. Программу, построенную на принципах ООП, можно представить как совокупность взаимодействующих объектов. Объект А воздействует на объект Б, и для Б возникает событие, на которое Б отреагирует либо ответным воздействием на А, либо воздействием на объект В. Если А — внешний для системы объект, то Б — интерфейсный объект (отвечающий за взаимодействие системы с внешним миром). Операционная система Windows — объектно-ориентированная система, в которой определены классы для производства объектов, обеспечивающих, в частности, интерфейс с пользователем. Программа, написанная под Windows, обращается к ней, командуя какой интерфейсный объект на каком именно месте создать — так строится внешний вид (интерфейс) программы. Эти интерфейсные объекты кажутся принадлежащими программе, но на самом деле они — часть Windows: именно она отвечает за их базовый внешний вид и поведение. Поэтому, когда пользователь воздействует на интерфейсный объект программы (нажимает кнопку, выбирает пункт меню и т.п.), для этого объекта происходит событие и Windows переводит это событие в сообщение для программы. При написании программы предусматривается однозначная реакция на это сообщение в виде метода, а в методе вызываются методы других объектов. Т.е. воздействие на интерфейсный объект приводит к появлению в недрах Windows сообщения, которое, приходя в программу, запускает цепочку взаимодействий внутренних для нее объектов. Таким образом, ООП программа фактически встраивается в ОС Windows. Билет №18. Классы. Основные понятия Класс – это обобщенное понятие, определяющие характеристики и поведение некоторого множества объектов, называемых экземплярами класса. «Классический» класс содержит данные, определяющие свойства объектов класса, и методы, определяющие их поведение. Для Windows-приложений в класс добавляется третья составляющая – события, на которые может реагировать объект класса. Все классы библиотеки .Net, а также все классы, которые создает программист в среде .Net, имеют одного общего предка – класс object. Все программы, рассмотренные ранее, состояли из одного класса с одним методом Main и несколькими вспомогательными статическими методами. Теперь рассмотрим понятие «класс» более подробно. Описание класса содержит ключевое слово class, за которым следует его имя, а далее в фигурных скобках — тело класса. Кроме того, для класса можно задать его базовые классы (предки) и ряд необязательных ат рибутов и спецификаторов, определяющих различные характеристики класса: [ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ] {тело_класса} Простейший пример класса: class Demo{} Спецификаторы определяют свойства класса, а также доступность класса для других элементов программы. Возможные значения спецификаторов перечисле ны в следующей таблице: № Спецификатор Описание 1. new Задает новое описание класса взамен унаследованного от предка. Используется для вложения классов (в иерархии объектов). 2. public Доступ к классу не ограничен 3. protected Доступ только из данного или производного класса. Используется для вложенных классов. 4. internal Доступ только из данной программы (сборки). 5. protected internal Доступ только из данного и производного класса и из данной программы (сборки). 6. private Доступ только из элементов класса, внутри которых описан данный класс. Используется для вложенных классов. 7. static Статический класс. Позволяет обращатся к методам класса без создания экземпляра класса 8. sealed Бесплодный класс. Запрещает наследование данного класса. Применяется в иерархии объектов. 9. abstract Абстрактный класс. Применяется в иерархии объектов. Спецификаторы 2-6 называются спецификаторами доступа. Они определяют, откуда можно непосредственно обращаться к данному классу. Спецификаторы доступа могут комбинироваться с остальными спецификаторами. Класс можно описывать непосредственно внутри пространства имен или внутри другого класса. В последнем случае класс называется вложен ным. В зависимости от места описания класса некоторые из этих спецификаторов могут быть запрещены. Для каждого объекта при его создании в памяти выделяется отдельная область, в которой хранятся его данные. В классе могут присутствовать ста тические элементы, которые существуют в единственном экземпляре для всех объектов класса. Статические данные часто называют данными класса, а осталь ные — данными экземпляра. Для работы с данными класса используются статические методы класса, для работы с данными экземпляра — методы экземпляра, или просто методы. До сих пор мы использовали в программах только данные (переменные и константы) и методы. В общем случае класс может содержать следующие функциональные элементы: 1. Данные: переменные или константы. 2. Методы, реализующие не только вычисления, но и другие действия, выполняемые классом или его экземпляром. 3. Конструкторы (реализуют действия по инициализации экземпляров или класса в целом). 4. Свойства (определяют характеристики класса в соответствии со способами их задания и получения). 5. Деструкторы ( определяют действия, которые необходимо выполнить до того, как объект будет уничтожен). 6. Индексаторы (обеспечивают возможность доступа к элементам класса по их порядковому номеру). 7. Операции (задают действия с объектами с помощью знаков операций). 8. События (определяют уведомления, которые может генерировать класс). 9. Типы (типы данных, внутренние по отношению к классу). Билет №23. Иерархия классов. Наследование. Наследование конструкторов. Иерархия классов Управлять большим количеством разрозненных классов довольно сложно. С этой проблемой можно справиться путем упорядочивания и ранжирования классов, то есть объединяя общие для нескольких классов свойства в одном классе и используя его в качестве базового. Эту возможность предоставляет механизм наследования. Наследование применяется для следующих взаимосвязанных целей: 5) исключения из программы повторяющихся фрагментов кода; 6) упрощения модификации программы; 7) упрощения создания новых программ на основе существующих. Наследование является единственной возможностью использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения. |