Классы коллекций общего назначения

Класс Описание Реализуемые интерфейсы
ArrayList Динамически изменяемый по размерам массив объектов любого типа ICollection, IEnumerable, IEnumerator, IList, ICloneable
HashTable Коллекция объектов, идентифицируемая по числовому ключу ICollection, IDictionary, ICloneable, IEnumerable
Queue   Стандартная очередь или последовательный список (то есть каждый объект обрабатывается по порядку) ICollection, IEnumerable, ICloneable
Stack Стек, обеспечивающий функциональные возможности стека: добавление в стек Push(…), извлечение Pop(…). ICollection, IEnumerable, ICloneable

Итак, типы пространства имён System.Collections используют общие функциональные возможности. В этом и заключается суть программирования на основе интерфейсов. При реализации одного и того же интерфейса в разных классах мы получаем возможность обращаться одинаково с различными типами объектов. Такой механизм называется интерфейсным полиморфизмом.

Динамическая идентификация типов. Проверка типа с помощью ключевого слова is. Использование операторов as, typeof.

Принципы обобщённого программирования (абстрагирование и иерархия) были рассмотрены при изучении интерфейсов и коллекций. Динамическая идентификация типов позволяет распознать тип данных во время работы программы. Она используется при работе с массивом объектов базового класса, а так же для проверки удачно ли выполнена операция «приведение к типу». Динамическая идентификация типов является ключевым компонентом средства – отражение (предоставление информации о типе).

В C# динамическую идентификацию типов поддерживают три ключевых слова: is, as, typeof.

Проверка типа с помощью ключевого слова – is (является ли)

С помощью is можно определить: имеет ли рассматриваемый объект заданный тип. Общая форма его записи:

Выражение isТип.
Тип выражения сравнивается с указанным типом и возвращается trueили false.

Задание: В проекте Планиметрия объявить объекты класса Point и Otrezok, распознать типы с помощью ключевого слова is.
//В Main():

Point T1 = new Point(-28,39);

Point T2 = new Point(2, 5);

Otrezok Otr1 = new Otrezok(T1,T2);

///Напишем логическое выражение:

//1)

if (T1 is Point)

Console.WriteLine("Объект Т1 имеет тип Point");

//Выполнить!

//2)

if (Otr1 is Point)

Console.WriteLine("Объект Otr1 совместим с типом Point");

//Выполнить!

// Получим true, так как отрезок наследуется от класса Point, т.е совместим с ним.

//3)

if (T1 is Otrezok)

Console.WriteLine("Объект T1 совместим с типом Otrezok");

//Выполнить!

//Получим false, ведь класс Point не наследуется от класса Otrezok.

//4)

if (T2 is Object)

Console.WriteLine("T2 - это объект");

//Выполнить!

4.2. Использование оператораas (как)

Иногда во время работы программы требуется выполнить операцию приведения типов (явное приведение), не генерируя исключения в случае, если попытка будет неудачной. Для этого предусмотрен оператор as.
Общая форма его записи:

Выражение as Тип.

В отличие от слова is, если операция прошла успешна, то возвращается ссылка на указанный тип, а иначе возвращается null-ссылка. Оператор as – альтернатива слову is.

Задание: Проверить, можно ли объект T1 использовать как отрезок.

//В Main():

if (T1 as Otrezok != null)

Otr1 = (Otrezok)T1;

else Otr1 = null;

if (Otr1 == null)

Console.WriteLine("Приведение типов не разрешено!");

else

Console.WriteLine("Приведение типов разрешено!");

//Выполнить!

Использование оператора typeof

Иногда нужно получить информацию о типе данных. Для таких случаев в C# предусмотрен оператор typeof (Тип). Он использует класс System.Type для получения данных об указанном типе.

Задание: В проекте Планиметрия получить полное имя типа заданного класса SteamReader (класс для создания входного потока символов, текстового файла).

//В Main():

//Объявим объект класса Type:

Type Ob = typeof(StreamReader);

Console.WriteLine("Полное имя типа " + Ob.FullName);

//Выполнить!

if (Ob.IsClass)

Console.WriteLine("Это - класс!");

else

Console.WriteLine("Это - не класс");

//Выполнить!

if (Ob.IsAbstract)

Console.WriteLine("Это - абстрактный класс!");

else

Console.WriteLine("Это - конкретный класс!");

//Выполнить!

Задание: Аналогично получить информацию о своём классе Otrezok.

Type ob = typeof(Otrezok);

Console.WriteLine("Полное имя типа " + ob.FullName);

//Выполнить!

if (ob.IsClass)

Console.WriteLine("Это - класс!");

else

Console.WriteLine("Это - не класс");

//Выполнить!

if (ob.IsAbstract)

Console.WriteLine("Это - абстрактный класс!");

else

Console.WriteLine("Это - конкретный класс!");

//Выполнить!

Наши рекомендации