Если вы не находитесь в ситуации, когда вы должны использовать .NET 1.0 / 1.1 или вам необходимо взаимодействовать с устаревшим кодом, который использует ArrayList
- вам действительно следует избегать использования ArrayLists
в новом коде. Вместо этого используйте универсальный тип коллекции List<>
.
Операции добавления, удаления и замены элемента в List<T>
довольно просты.
Допустим, у вас есть гипотетический тип Animal
, экземпляры которого вы будете хранить в списке:
Animal dog = new Animal("dog");
Animal cat = new Animal("cat");
List<Animal> animalList = new List<Animal>();
// example of adding items to the list
animalList.Add( dog );
animalList.Add( cat );
// example of removing items form the list
animalList.Remove( cat );
// example of replacing an item at a given position
animalList[0] = new Animal("giraffe");
Публичные интерфейсы для List<T>
и ArrayList
на самом деле очень похожи. Основное отличие состоит в том, что ArrayList может хранить только ссылки object
, так как он был реализован раньше, чем .NET поддерживал генерики.
ArrayList listOfObjects = new ArrayList();
int myAge = 207;
listOfObjects.Add( (object)myAge );
В приведенном выше примере вы ДОЛЖНЫ приводить типы, такие как int
(, которые являются типами значений в .NET ), к объекту. Это приводит к преобразованию в бокс - который копирует тип значения int в новое место в куче и передает его в ArrayList. Преобразования в боксы , являются одним из недостатков использования ArrayList
- List<T>
, избегая этого, поскольку является универсальным классом . Другая проблема заключается в том, что ArrayList
не мешает вам смешивать разные типы в списке вместе. Например:
listOfObjects.Add( (object)myAge );
listOfObjects.Add( "Hello World" );
оба разрешены. Однако при доступе к элементам ArrayList
вы должны знать , какой тип вы пытаетесь получить. Это делает ArrayList
более хрупким как тип коллекции, потому что вызывающая сторона должна написать код, чтобы либо защитить себя от произвольных типов, хранящихся в ArrayList
, либо использовать проверки типов отражения и времени выполнения для преобразования сохраняемых значений. List<T>
позволяет избежать обеих этих проблем, позволяя компилятору проверять, что в коллекции хранятся только подходящие типы (те, которые соответствуют параметру типа T
в List<T>
).
Существует гораздо больше, что можно написать о взаимодействии с коллекциями - и это действительно так. Вот ссылка только на одну из множества замечательных книг по этой теме. Мой совет: прежде чем вы начнете писать код в .NET / C #, вам следует потратить время на ознакомление с основными понятиями языка и системы типов C # - что такое ссылочные и ценностные типы. Какие примитивы. Какие дженерики. и т. д. Это поможет гарантировать, что когда вы начинаете писать код, код делает то, что вам нужно. C # имеет сложную и богатую систему типов, а также обширную библиотеку классов инфраструктуры. Важно хорошо разбираться в основных аспектах языка, прежде чем вы слишком углубитесь в написание реального кода. Примеры, подобные тем, что я показываю выше, покажут вам лишь далеко - и они уже вводят множество языковых концепций: переменные, конструкторы, обобщения, преобразования в бокс и т. Д.