Essentials: Порт C++ -> C#; Аналог вектора std::vector

вторник, 18 ноября 2008, Oleksandr Reminnyi

Вчора зіткнувся з ситуацією, коли потрібно зроити описане перетворення.

Перша думка - використовувати ArrayList - просто і зручно, однак має підводні камені.

Дана структура підтримує додавання в колекцію об'єктів б-я типу. Коли може виникнути проблема?

  1. Час.

    Справа в тому, що при виконанні коду б-я об'єкт спочатку потрібно буде конвертувати до типу object - операція називається "упаковка". При розпаковці також потрібні додаткові часові ресурси.

  2. Перевірка типу

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]; // - не потрібне явне приведення типів


Ищите нас в интернетах!

Комментарии

Свежие вакансии