Essentials: Порт C++ -> C#; Аналог вектора std::vector
Вчора зіткнувся з ситуацією, коли потрібно зроити описане перетворення.
Перша думка - використовувати ArrayList - просто і зручно, однак має підводні камені.
Дана структура підтримує додавання в колекцію об'єктів б-я типу. Коли може виникнути проблема?
Час.
Справа в тому, що при виконанні коду б-я об'єкт спочатку потрібно буде конвертувати до типу object - операція називається "упаковка". При розпаковці також потрібні додаткові часові ресурси.
Перевірка типу
ArrayList не проводить перевірку типу. тому у випадку коли ви всередину записали об'єкт типу "string" а потім при розпаковці перетворюєте явно до типу "int" - відбувається генерація помилки.
ArrayList arr = new ArrayList(); arr.Add(1); arr.Add("1"); int a = (int)arr[0]; // - все ок, однак втрата часу на розпаковку int a = (int)arr[1]; // - все ок на етапі компіляції, однак під час виконання - помилка
Тому як "правильний" варіант раджу використовувати тип даних List з простору імен System.Collections.Generic, т.я. при створенні данного масиву об'єктів ви зобов'язані вказати тип даних, що буде зберігатись. Упаковка та розпаковка також відбуватись не буде, тому - користуйтесь;).
List arr = new List(); arr.Add(1); arr.Add("1"); //помилка при компіляції int a = arr[0]; // - не потрібне явне приведення типів