Мой код усеян коллекциями - я не необычная вещь. Однако использование различных типов коллекций не является очевидным и тривиальным. Как правило, я хотел бы использовать тип, который предоставляет "лучший" API, и имеет наименьший синтаксический шум. (См. Лучшая практика при возврате массива значений, Использование массивов списков - лучшие практики для сопоставимых вопросов). Существуют рекомендации, указывающие, какие типы использовать в API, но они непрактичны в нормальном (не-API) коде.
Например:
new ReadOnlyCollection<Tuple<string,int>>(
new List<Tuple<string,int>> {
Tuple.Create("abc",3),
Tuple.Create("def",37)
}
)
List
- очень распространенная структура данных, но , создавая их таким образом, включает в себя довольно немного синтаксического шума - и это может легко ухудшиться (например, словари). Как оказалось, многие списки никогда не меняются или, по крайней мере, никогда не продлеваются. Разумеется, ReadOnlyCollection
вводит еще более синтаксический шум, и он даже не передает совершенно то, что я имею в виду; ведь ReadOnlyCollection
может обернуть мутирующую коллекцию. Иногда я использую массив внутри и возвращаю IEnumerable
для указания намерения. Но большинство из этих подходов имеют очень низкое отношение сигнал/шум; и это абсолютно важно для понимания кода.
Для 99% всего кода, который не является общедоступным API, нет необходимости следовать Руководствам Framework: однако мне все еще нужен понятный код и тип, который сообщает о намерениях.
Итак, каков наилучший способ справиться с основной задачей bog-создания небольших коллекций для переноса значений? Если массив возможно больше чем List
, где это возможно? Что-то еще? Какой лучший способ - чистый, удобочитаемый, достаточно эффективный - прохождение вокруг таких небольших коллекций? В частности, код должен быть очевиден для будущих сопровождающих, которые не прочитали этот вопрос и не хотят читать фрагменты документов API, но все же понимают, что это за намерение. Также очень важно минимизировать беспорядок кода, поэтому такие вещи, как ReadOnlyCollection
, в лучшем случае сомнительны. Ничего плохого в многословных типах для основного API с небольшими поверхностями, но не как общая практика внутри большой базы кода.
Какой лучший способ передать списки значений без большого количества беспорядков кода (таких как параметры явного типа), но которые все еще четко фиксируют намерения?
Изменить: пояснили, что речь идет о создании короткого, четкого кода, а не об общедоступных API.