allMyObjects.Add(true);
allMyObjects.Add(new OperatingSystem(PlatformID.MacOSX,
new Version(10, 0)));
allMyObjects.Add(66);
allMyObjects.Add(3.14);
}
В ряде случаев вам будет требоваться исключительно гибкий контейнер, который способен хранить буквально все (как было здесь показано). Но большую часть времени вас интересует
IPointy.До появления обобщений единственный способ решения проблемы, касающейся безопасности в отношении типов, предусматривал создание вручную специального класса (строго типизированной) коллекции. Предположим, что вы хотите создать специальную коллекцию, которая способна содержать только объекты типа Person
namespace IssuesWithNonGenericCollections
{
public class Person
{
public int Age {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public Person{}
public Person(string firstName, string lastName, int age)
{
Age = age;
FirstName = firstName;
LastName = lastName;
}
public override string ToString
{
return $"Name: {FirstName} {LastName}, Age: {Age}";
}
}
}
Чтобы построить коллекцию, которая способна хранить только объекты Person
System.Collection.ArrayList внутри класса по имени PeopleCollection и сконфигурировать все члены для оперирования со строго типизированными объектами Person, а не с объектами типа System.Object. Ниже приведен простой пример (специальная коллекция производственного уровня могла бы поддерживать множество дополнительных членов и расширять абстрактный базовый класс из пространства имен System.Collections или System.Collections.Specialized):using System.Collections;
namespace IssuesWithNonGenericCollections
{
public class PersonCollection : IEnumerable
{
private ArrayList arPeople = new ArrayList;
// Приведение для вызывающего кода.
public Person GetPerson(int pos) => (Person)arPeople[pos];
// Вставка только объектов Person.
public void AddPerson(Person p)
{
arPeople.Add(p);
}
public void ClearPeople
{
arPeople.Clear;
}
public int Count => arPeople.Count;
// Поддержка перечисления с помощью foreach.
IEnumerator IEnumerable.GetEnumerator => arPeople.GetEnumerator;
}
}
Обратите внимание, что класс PeopleCollection
IEnumerable, который делает возможной итерацию в стиле foreach по всем элементам, содержащимся в коллекции. Кроме того, методы 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");
PersonCollection myPeople = new PersonCollection;
myPeople.AddPerson(new Person("Homer", "Simpson", 40));
myPeople.AddPerson(new Person("Marge", "Simpson", 38));
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT