Является ли массив строк хорошей структурой для передачи обратно набора значений из функции?

#.net #return-value

#.net #возвращаемое значение

Вопрос:

У меня есть функция в приложении .NET, которая работает с коллекцией файлов и записывает некоторые файлы на диск. Я хочу вернуть коллекцию имен файлов, которые были записаны на диск. Все, что я собираюсь сделать с возвращенной коллекцией, это перебрать каждую из них и выполнить операцию с файлом. Изначально я думал, что в этом случае лучше всего подойдет массив строк, но подумал, что могу спросить здесь, на случай, если другая структура может служить лучше. Например, будет ли LIST<String> излишним, если я просто перебираю коллекцию? Я пишу функцию, используя VB.NET но примеры C # тоже хороши. Спасибо.

Ответ №1:

Если все, что вам действительно нужно уметь делать, это перебирать результаты, достаточно вернуть IEnumerable<string> из вашей функции.

Это предотвращает привязку вызывающего объекта к какой-либо конкретной структуре данных… все, что им требуется, — это что-то, что можно повторить. В этом случае ваша реализация может свободно использовать и возвращать любую структуру, имеющую смысл — List<string> , a HashSet<string> , a string[] … на самом деле это не имеет значения. Фактически, вы можете свободно создавать структуру данных, отличную от простого списка, если вам так нужно — до тех пор, пока она реализует IEnumerable<string> интерфейс, на который не влияют ваши вызывающие устройства.

Я думаю, что другой вопрос, который следует рассмотреть, заключается в том, является ли массив хорошей структурой для внутреннего использования для создания набора имен файлов. Действительно ли коллекция фиксированного размера, но изменяемая, является лучшей конструкцией для вашей операции? Часто при таких операциях неизвестно, со сколькими элементами они будут работать — в этом случае коллекция переменного размера (например, List<> или HashSet<> ) имеет больше смысла. Зачем тогда нести расходы на преобразование такой коллекции в массив просто для того, чтобы вернуть ее?

Комментарии:

1. Мне действительно нравится то, что вы хотели сказать в своем последнем абзаце. Вы правильно заметили, что у меня может не быть фиксированного количества имен файлов. Спасибо.

Ответ №2:

Прямо из рекомендаций по разработке фреймворка — Icaza и Хейлсберг

8.1 «Предпочитаю использовать коллекции, а не массивы для общедоступных API»

8.3.3 «Предпочитать коллекции массиву»

НО

«Рассмотрите возможность использования массивов в низкоуровневых API для минимизации потребления памяти и максимизации производительности». (также часть 8.3.3)