Программирование >>  Обработка исключительных ситуаций 

1 ... 95 96 97 [ 98 ] 99 100 101 ... 142


По умолчанию при создании объекта типа ArrayLi st строится массив из 16 элементов типа object. Можно задать желаемое количество элементов в массиве, передав его в конструктор или установив в качестве значения свойства Capacity, например:

ArrayList arrl = lewv ArrayList(); создается массив из 16 элементов ArrayLi st arr2 = new ArrayList( 1000); создается массив из 1000 элементов ArrayList аггЗ = new ArrayList();

arr3.Capacity = 1000; количество элементов задается

Основные методы и свойства класса ArrayLi st перечислены в табл. 13.4. Таблица 13.4. Основные элементы класса ArrayList

Элемент

Описание

Capacity Свойство Емкость массива (количество элементов, которые могут

храниться в массиве)

Count Свойство Фактическое количество элементов массива

Item Свойство Получить или установить значение элемента по заданному

индексу

Add Метод Добавление элемента в конец массива

AddRange Метод Добавление серии элементов в конец массива

BinarySearch Метод Двоичн1й поиск в отсортированном массиве или его части Clear Метод Удаление всех элементов из массива

Clone Метод Поверхностное копирование1 элементов одного массива

в другой массив

CopyTo Метод Копирование всех или части элементов массива в одномерный

массив t

GetRange Метод Получение значений подмножества элементов массива в виде объекта типа ArrayLi st

IndexOf Метод Поиск первого вхождения элемента в массив (возвращает

индекс найденного элемента или -1, если элемент не найден)

Insert Метод Вставка элемента в заданную позицию (по заданному индексу)

InsertRange Метод Вставка группы элементов, начиная с заданной позиции

LastIndexOf Метод Поиск последнего вхождения элемента в одномерн1й массив

Remove Метод Удаление первого вхождения заданного элемента в массив

RemoveAt Метод Удаление элемента из массива по заданному индексу

RemoveRange Метод Удаление группы элементов из массива

Reverse Метод Изменение порядка следования элементов на обратный

SetRange Метод Установка значений элементов массива в заданном диапазоне

Sort Метод Упорядочивание элементов массива или его части

TrimToSize Метод Установка емкости массива равной фактическому количеству элементов

Это понятие рассматривалось в разделе Клонирование объектов (см. с. 205).



Класс ArrayLi st реализован через класс Array, то есть содержит закрытое поле этого класса. Поскольку все типы в С# являются потомками класса object, массив может содержать элементы произвольного типа. Даже если в массиве хранятся обычные целые числа, то есть элементы значимого типа, внутренний класс является массивом ссылок на экземпляры типа object, которые представляют собой упакованный тип-значение. Соответственно, при занесении в массив выполняется упаковка, а при извлечении - распаковка элемента. Это не может не, сказаться на быстродействии алгоритмов, использующих ArrayLi st.

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

Пример занесения элементов в экземпляр класса ArrayLi st:

arrl.AddC 123 ); arrl.Add( -2 ): arrl.AddC Вася );

Доступ к элементу выполняется по индексу, однако при этом необходимо явным образом привести полученную ссылку к целевому типу, например:

int а = (int) arrl[0] int b = (int) arrl[l] string s = (string) arrl[2]

Попытка приведения к типу, не соответствующему хранимому в элементе, вызы вает генерацию исключения InvalidCastException.

Для повышения надежности программ применяется следующий прием: экзе ляр класса ArrayLi st объявляется закрытым полем класса, в котором необход хранить коллекцию значений определенного типа, а затем описываются мето работы с этой коллекцией, делегирующие свои функции методам ArrayLi st. Э~ способ иллюстрируется в листинге 13.1, где создается класс для хранения объек тов типа Monster и производных от него. По сравнению с аналогичным листин из раздела Виртуальные методы (см. с. 178), в котором используется об1ч~ массив, у нас появилась возможность хранить в классе Stado произвольное ко чество элементов.

Листинг 13.1. Коллекция объектов

using System;

using System.Col lections;

namespace ConsoleApplicationl

class Monster { ... }

class Daemon : Monster { ... }

class Stado : IEnumerable



private ArrayList list;

public StadoO { list = new ArrayListO;

public void Add( Monster m ) { list.Add( m ) ; } public void ReoveAlC int i ) { list.RemoveAtt i ); } public void ClearO { list.ClearO; }

public IEnumerator GetEnumeratorO { return list.GetEnumeratorO; }

class Classl { static void MainO

Stado stado = new StadoO;

stado.Add( new Monster( Monia ) ,); stado.Add( new MonsterC Mo ) ); stado.Add( new Daemon ( Dimon , 3 ) );

stado. RemoveAU 1 );

foreach ( Monster x in stado ) x. PassportO;

Результат работы программы:

Monster Monia health = 100 mrio = 100

Daemon Dimon health = 100 ammo = 100 brain = 3

Недостатком этого решения является то, что для кажждого метода стандартной коллекции приходится описывать метод-оболочку, вызывающий стандартный метод. Хотя это и несложно, но несколько неизящно. В С#, начиная с версии 2.0, появились классы-прототипы (generics), позволяющие решить эту проблему. Мы рассмотрим их в следующем разделе.

Классы-прототипы

Многие алгоритмы не зависят от типов данных, с которыми они работают. Простейшими примерами могут служить сортировка и поиск. Возможность отделить алгоритмы от типов данных предоставляют классы-прототипы (generics) - классы, имеющие в качестве параметров типы данн1х. Чаще всего эти классы применяются для хранения данных, то есть в качестве контейнерных классов, или коллекций.

ПРИМЕЧАНИЕ-

Английский термин generics переводится в нашей литературе по-разному: универсальные классы, родовые классы, параметризованные классы, обобщенные классы, шаблоны, классы-прототипы и даже просто генерики. Наиболее адекватными мне кажутся варианты классы-прототипы и параметризованные классы , поэтому в последующем изложении в основном используются именно эти термины, хотя и их точными не назовешь.



1 ... 95 96 97 [ 98 ] 99 100 101 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика