Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 сем Инфа готово.docx
Скачиваний:
24
Добавлен:
04.06.2015
Размер:
255.66 Кб
Скачать

Вопрос 12. Классы объекты….

Класс (class) -- множество объектов, связанных общностью структуры и поведения; абстрактное описание данных и поведения (методов) для совокупности похожих объектов, представители которой называются экземплярами класса.

Объект (object) -- конкретная реализация класса, обладающая характеристиками состояния, поведения и индивидуальности, синоним экземпляра.

Переменная класса (class variable) -- поле данных, являющееся общим для всех экземпляров данного класса.

Метод (method) -- процедура или функция, связанная с классом, вызываемая в стиле пересылки сообщений.

Конструктор (constructor) -- метод, используемый для создания нового объекта; обеспечивает решение двух задач: выделяет память под новую переменную и гарантирует, что переменная инициализируется надлежащим образом.

Деструктор (destructor)— специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).

Объявление класса:

КлючевоеСловоКласса ИмяКласса : ИмяКлассаРодителя

{

Конструктор;

Деструктор;

СпецификаторДоступа:

ТипЭлементаКласса ИмяЭлементаКласса

};

Начнем, пожалуй, с очереди, т.к. она более привычна для нас. С очередями мы встречаемся повсеместно: в магазине, в институте, на работе. Иногда мы можем их и не замечать. В программных системах также часто используются очереди. Например, при отправке документа на печать, он становится в очередь.

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

Как работает очередь, думаю, объяснять не стоит, все мы стояли в очереди в магазине. Отмечу, что бывает несколько видов очередей, например, очередь по приоритетам. Пример из жизни: ветераны и инвалиды обслуживаются вне очереди (у них более высокий приоритет), уверен, что президента тоже пропустили бы вперед (даже вперед ветеранов, значит у него приоритет еще выше).

В данной статье мы не будем трогать очередь с приоритетами, а лишь рассмотрим классическую очередь, т.е. первым пришел, первым ушел (FIFO - first in, first out).

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

Класс Queue находится в пространстве имен System.Collections, поэтому перед тем, как использовать его, желательно подключить это пространство, чтобы в дальнейшем не утруждать себя записями вида System.Collections.Queue:

using System.Collections;

Сейчас можно смело работать с очередью. Для работы нам могут понадобиться следующие методы:

Enqueue() - помещает элемент в конец очереди

Dequeue() - достает из очереди первый элемент

В принципе этого вполне достаточно. У класса Queue есть еще несколько полезных методов:

Contains() - проверяет имеется ли данный объект в очереди

Count - свойство, содержащее количество элементов в очереди

Peek() - возвращает первый элемент в очереди, но не удаляет его

Queue q = new Queue(3);

Нужно помнить, что невозможно узнать, кто в очереди второй или третий, пока не "достать" из очереди соответствующее количество элементов. Если вам такая функция нужна, то скорее всего придется отказаться от использования класса Queue и реализовывать очередь самому, на основе массива или ArrayList-а (о нем будет рассказано в следующей статье).

Хочу так же обратить ваше внимание на то, что очередь не является типизированной, т.е. в ней могут содержаться объекты разных типов, так что нужно быть внимательными. Т.е. если мы сделаем так:

q.Enqueue("строка"); //помещаем в очередь строку

q.Enqueue(3); //помещаем в очередь тройку

q.Enqueue(4); //помещаем в очередь четверку

q.Enqueue(5); //помещаем в очередь пятерку

То наша программа "вылетит" с ошибкой, при попытке приведения типов.

Пора перейти к изучению структуры "Стек". Со стеком мы также встречаемся в реальной жизни, правда, не так часто как с очередью. Примеров стека в жизни тоже довольно-таки много. Например, диски, надетые на шпиндель, стопка тарелок и другие. От очереди стек отличается лишь тем, что первым "достается" не тот, кто первым пришел, а тот, кто пришел последним (эх, хорошо, что в магазинах очереди, а не стеки). В программировании стеки применяются не реже чем очереди. Работать с ними так же легко. Как и для очередей в существует готвый класс Stack, который содержит все необходимые функции, а именно:

Push() - помещает элемент в стек

Pop() - достает элемент из стека

Peek() - возвращает верхний элемент стека

Contains() - проверяет содержится ли элемент в стеке

Count - свойство содержащее количество объектов в очереди

Stack s = new Stack();

Память в приложениях .NET

Как вам, вероятно, известно, в приложениях .NET используются разные типы памяти: стек, неуправляемая куча, управляемая куча. Напомним вкратце их основные характеристики:

Стек — это область памяти, где во время выполнения приложения хранятся локальные переменные, параметры метода, возвращаемые значения и другие временные данные. Каждому потоку выделяется отдельный стек, используемый им в процессе работы как вспомогательная область. Очистка стека не является обязательной задачей сборщика мусора, потому что та часть стека, которая резервируется при вызове метода, автоматически очищается при возврате из него. Однако следует заметить, что сборщику мусора известны ссылки на объекты, хранящиеся в стеке. Когда для метода создается экземпляр объекта, то ссылка на него (32-разрядное либо 64-разрядное целое число, в зависимости от платформы) остается в стеке, но сам объект хранится в управляемой куче; он удаляется сборщиком мусора, как только переменная выходит из области видимости.

Неуправляемая куча используется для структур данных времени выполнения, таблиц методов, языка MSIL, динамически скомпилированного (JIT) кода и т.п. Неуправляемый код размещает объекты в неуправляемой куче либо в стеке в зависимости от того, как был создан экземпляр объекта. Управляемый код может выделять память в неуправляемой куче непосредственно при вызове неуправляемых API Win32® либо при создании экземпляров объектов COM. Сама среда CLR широко использует неуправляемую кучу для хранения своих структур данных и кода.

Управляемая куча — это область памяти, в которой размещаются управляемые объекты и работает сборщик мусора. В среде CLR используется сборщик мусора, работающий по поколениям и осуществляющий сжатие памяти. Суть работы по поколениям заключается в том, что все объекты имеют возраст, и всякий раз по окончании сбора мусора возраст оставшихся объектов увеличивается; работа по поколениям увеличивает производительность сборщика. Во всех версиях среды .NET Framework для сборщика мусора поддерживаются три поколения: Gen0, Gen1 и Gen2 (перечисленные в порядке старшинства, т.е. от самого младшего к самому старшему). Осуществляя сжатие памяти, сборщик мусора размещает объекты в управляемой куче таким образом, чтобы в ней не осталось незанятых участков, а вся освободившаяся память была связной. Перемещение больших объектов связано со значительными затратами; чтобы избежать их, сборщик мусора размещает большие объекты в специальной куче, которая называется кучей больших объектов и не подлежит сжатию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]