по всем элементам, содержащимся в коллекции. Кроме того, методы
GetPerson
и
AddPerson
прототипированы для работы только с объектами
Person
, а не растровыми изображениями, строками, подключениями к базам данных или другими элементами. Благодаря определению таких классов теперь обеспечивается безопасность в отношении типов, учитывая, что компилятор C# будет
способен выявить любую попытку вставки элемента несовместимого типа. Обновите операторы
using
в файле
Program.cs
, как показано ниже, и поместите в конец текущего кода метод
UserPersonCollection
:
using System;
using System.Collections;
using IssuesWithNonGenericCollections;
// Операторы верхнего уровня в Program.cs
static void UsePersonCollection
{
Console.WriteLine("***** Custom Person Collection *****\n");
Хотя специальные коллекции гарантируют безопасность в отношении типов, такой подход обязывает создавать (в основном идентичные) специальные коллекции для всех уникальных типов данных, которые планируется в них помещать. Таким образом, если нужна специальная коллекция, которая могла бы оперировать только с классами, производными от базового класса
Car
, тогда придется построить очень похожий класс коллекции:
не менее, класс специальной коллекции ничего не делает для решения проблемы с накладными расходами по упаковке/распаковке. Даже если создать специальную коллекцию по имени
IntCollection
, которая предназначена для работы только с элементами
System.Int32
, то все равно придется выделять память под объект какого-нибудь вида, хранящий данные (например,
Независимо от того, какой тип выбран для хранения целых чисел, в случае применения необобщенных контейнеров затруднительного положения с упаковкой избежать невозможно.
Первый взгляд на обобщенные коллекции
Когда используются классы обобщенных коллекций, все описанные выше проблемы исчезают, включая накладные расходы на упаковку/распаковку и отсутствие безопасности в отношении типов. К тому же необходимость в создании специального класса (обобщенной) коллекции становится довольно редкой. Вместо построения уникальных классов, которые могут хранить объекты людей, автомобилей и целые числа, можно задействовать класс обобщенной коллекции и указать тип хранимых элементов. Добавьте в начало файла
Program.cs
следующий оператор
using
:
using System.Collections.Generic;
Взгляните на показанный ниже метод (добавленный в конец файла
Program.cs
), в котором используется класс
List<T>
(из пространства имен
System.Collection.Generic
) для хранения разнообразных видов данных в строго типизированной манере (пока не обращайте внимания на детали синтаксиса обобщений):
static void UseGenericList
{
Console.WriteLine("***** Fun with Generics *****\n");
// Этот объект List<> может хранить только объекты Person.
List<Person> morePeople = new List<Person>;
morePeople.Add(new Person ("Frank", "Black", 50));
Console.WriteLine(morePeople[0]);
// Этот объект ListO может хранить только целые числа.