Я отвечаю на это с точки зрения Java, но это та же самая основная проблема. Вы не должны чувствовать вину, используя более высокие абстракции. В конце концов, вы используете String
s вместо char[]
или даже byte[]
? Я бы даже предложил пойти еще дальше и по возможности использовать интерфейс List
. Единственная причина для того, чтобы сделать один шаг вниз, это соображения производительности.
Использование высшей коллекции абстракций имеет много преимуществ. Вы можете добавить декораторы, чтобы сделать список доступным только для чтения, сделать его фиксированным размером, проверить элементы, которые входят или выходят из коллекции, или используют представления (см. GetRange
в C # и subList
в Java).
Кстати, ArrayList
всегда должен основываться на примитивном массиве, иначе имя будет неправильным. Операции обычно реализуются так, как вы ожидаете при использовании примитивного массива. Если используется связанный список, его обычно называют просто - LinkedList
. Это также является преимуществом использования интерфейса: позже вы можете передумать об используемой реализации.
Есть несколько вещей, которые делают использование коллекций неуклюжим. Одно предостережение состоит в том, что коллекции обычно основаны на объектах, и языки имеют значительный разрыв между примитивными и объектными типами. Ограниченные дженерики тоже мало помогают. Тем не менее, я рекомендую коллекции над массивами, если нет веской причины.
Для значений примитивов вы также можете использовать библиотеку примитивов, например GNU Trove . Не знаю, есть ли что-нибудь подобное для C #.