Как правильно писать тесты 46 Цикл разработки 46 Структура проекта с тестами 51 Утверждения (Asserts) 52 Утверждения в форме ограничений 54 Категории 56

Вид материалаТесты

Содержание


Проблемы создания объектных образов и строго типизованные коллекции
Пространство имен System.Collections.Generic
Обобщенный класс
Подобный материал:
1   ...   35   36   37   38   39   40   41   42   ...   47

Проблемы создания объектных образов и строго типизованные коллекции




Строго типизованные коллекции можно найти в библиотеках базовых классов .NET, и это очень полезные программные конструкции. Однако эти пользовательские контейнеры мало помогают в решении проблем создания объектных образов. Даже если вы создадите пользовательскую коллекцию с именем IntCollection, предназначенную для работы только с типами данных System.Int32, вам придется создать объект некоторого типа для хранения самих данных (System.Array, System.Collections.ArrayList и т.п.).


public class IntCollection : IEnumerable

{

private ArrayList arInts = new ArrayList();

public IntCollection() { }


// Восстановление значения для вызывающей стороны.

public int GetInt(int pos) { return (int)arInts[pos]; }


// Операция создания объектного образа!

public void AddInt(int i)

{ arInts.Add(i); }


public void ClearInts()

{ arInts.Clear(); }


public int Count

{ get { return arInts.Count; } }


IEnumerator IEnumerable.GetEnumerator()

{ return arInts.GetEnumerator(); }

}


Вне зависимости от того, какой тип вы выберете для хранения целых чисел (System.Array, System.Collections.ArrayList и т.п.), вы не сможете избавиться от проблемы .NET 1.1, связанной с созданием объектных образов. Нетрудно догадаться, что здесь снова на помощь приходят обобщения. В следующем фрагменте программного кода тип System.Collections.Generic.List<> используется для создания контейнера целых чисел, не имеющего проблем создания объектных образов и восстановления значений при вставке и получении типов характеризуемых значений.


static void Main(string[] args)

{

// Без создания объектного образа!

List myInts = new List();

myInts.Add(5);


// Без восстановления значения!

int i = myInts[0];

}


Пространство имен System.Collections.Generic




Обобщенные типы присутствуют во многих библиотеках базовых классов .NET 2.0, но пространство имен System.Collections.Generic буквально наполнено ими (что вполне соответствует его названию). Подобно своему “родственнику” без обобщений (System.Collections), пространство имен System.Collections.Generic содержит множество типов класса и интерфейса, что позволяет вкладывать элементы в самые разные контейнеры. Совсем не удивительно, что обобщенные интерфейсы имитируют соответствующие необобщенные типы из пространства имен System.Collections.
  • ICollection
  • IComparer
  • IDictionary
  • IEnumerable
  • IEnumerator
  • IList



По соглашению для обобщенных типов их замещаемые параметры обозначаются буквами верхнего регистра. И хотя здесь допустимо использовать любые буквы (или слова), обычно используют T для обозначения типов, K — для ключей, а V — для значений.


В пространстве имен System.Collections.Generic определяется и ряд классов, реализующих многие из этих ключевых интерфейсов. В табл. представлены описания базовых типов класса из этого пространства имен, реализуемые ими интерфейсы и соответствующие типы из пространства имен System.Collections.



Обобщенный класс

Необобщенный аналог в System.Collections

Описание

Collection

CollectionBase

База для обобщенной коллекции

Comparer

Comparer

Выполняет сравнение двух обобщенных объектов

Dictionary

Hashtable

Обобщенная коллекция пар имен и значений

List

ArrayList

Список элементов с динамически изменяемыми размерами

Queue

Queue

Обобщенная реализация списка FIFO (дисциплина обслуживания типа “очередь”)

SortedDictionary

SortedList

Обобщенная реализация сортированного набора пар имен и значений

Stack

Stack

Обобщенная реализация списка LIFO (дисциплина обслуживания типа “стек”)

LinkedList



Обобщенная реализация двусвязного списка

ReadOnlyCollection

ReadOnlyCollectionBase

Обобщенная реализация набора элементов только для чтения