Читайте также:
|
|
Лекция 7. Обобщения
Производительность
Одним из основных преимуществ обобщений является производительность. При работе с множеством объектов можно использовать классы коллекций из пространства имен System.Collections. Добавление элемента, имеющего тип значений (не ссылочный) к такой коллекции требовало упаковки и распаковки, когда такое значение преобразовывалось в ссылочный тип и обратно.
Типы значений сохраняются в стеке. Типы ссылок — в куче. Классы С# являются ссылочными типами; структуры — типами значений..NET позволяет легко конвертироватъ типы значений в ссылочные, поэтому их можно использовать там, где ожидаются объекты (ссылочных типов). Например, значение типа int можно присвоить объекту. Преобразование типа значений в ссылочный тип называется упаковкой. Упаковка происходит автоматически, когда метод ожидает параметр ссылочного типа, а ему передается тип значений. С другой стороны, упакованный тип значений может быть обратно преобразован к простому типу значений с помощью распаковки. При распаковке требуется операция приведения.
Упаковку и распаковку применять легко, но они сильно влияют на производительность, особенно при выполнении итераций по большому количеству элементов.
Безопасность типов
Другим свойством обобщений является безопасность типов. Когда в классе ArrayList сохраняются объекты, то в коллекцию могут быть вставлены объекты различных типов. Следующий пример демонстрирует вставку целого, строки и объекта типа MyClass в коллекцию ArrayList:
ArrayList list = new ArrayList();
list.Add(44);
list.Add("mystring");
list. Add (new MyClass());
Теперь, если реализовать итерацию по коллекции приведенным ниже оператором foreach, который проходит по целым элементам, то компилятор примет этот код. Однако поскольку не все элементы коллекции могут быть приведены к типу int, возникнет ошибка во время выполнения:
foreach(int i in list)
{
Console.WriteLine(i);
}
Ошибки должны быть обнаружены как можно раньше. При использовании обобщенного класса List<T> обобщенный тип-параметр Т задает тип элементов, который допускается вставлять в коллекцию. Компилятор не пропустит следующий код, потому что метод Add() имеет недопустимые аргументы:
List<int> list = new List<int>();
list.Add(44);
list.Add("mystring"); // ошибка компиляции
list.Add(new MyClass()); // ошибка компиляции
Повторное использование двоичного кода
Обобщения повышают повторную используемость двоичного кода. Обобщенный класс может быть определен однажды, и на его основе могут быть созданы экземпляры многих типов. Вам не нужно при этом иметь доступ к исходным текстам.
В качестве примера рассмотрим код, использующий класс List<T> пространства имен System.Collections.Generic из сборки mscorlib для создания специализированных версий, предназначенных для хранения элементов типов int, string и MyClass:
List<int> list = new List<int>();
list.Add(44);
List<string> stringList = new List<string>();
stringList.Add("mystring");
List<MyClass> myclassList = new List<MyClass>();
myClassList.Add(new MyClass());
Обобщенные типы могут быть написаны на одном языке, а использованы на любом другом из языков. NET.
Дата добавления: 2015-07-07; просмотров: 162 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Безопасность при ремонте и эксплуатации аккумуляторных батарей. | | | Обзор обобщенных коллекций |