Массив структур или одна структура с массивом для каждого из его свойств
При разработке API я могу захотеть сохранить детали (например, запущенный процесс) в моей собственной структуре. Однако, если я собираюсь сделать это для более чем 1 процесса, то есть мне нужно несколько структур, если у меня будет массив структур или одна структура с массивом для каждого из его свойств (например, startTime, processName и других свойств процесса, которые я имею) увлекающийся).
Какой способ лучше для производительности и лучше для библиотеки API / классов?
Спасибо
4 ответа
ИМХО, вы должны создать массив структур, несмотря на то, что производительность достигается за создание всех структур. Организационный смысл того, что одно состояние хранится в одной структуре, намного перевешивает потерю производительности, а использование одной структуры с кучей массивов и простое назначение каждому процессу индекса в ряде массивов очень грязно и может быть огромной болью для отладки.,
Вы можете рассмотреть возможность использования class
а не struct
и я бы использовал список классов.
У Эрика Липперта есть несколько аргументов против использования массивов в API. Одним из наиболее убедительных для меня является то, почему вы хотите сохранить фиксированный размер коллекции, но при этом позволить потребителям изменять содержимое. Вы можете увидеть больше здесь.
В конечном счете, вы можете захотеть хранить их внутри, используя массивы, но я бы не стал подвергать это воздействию через API. Если людям нужно перечислить, используйте вместо этого IEnumerable
С точки зрения хранения данных, если кто-то будет часто получать доступ ко всем частям элементов чаще, чем кто-либо к определенной части из группы последовательных элементов, поведение кэширования будет лучше с массивом структур.
Более интересный вопрос - как выставить данные. Если вы представляете структуру в качестве индексатора, любой, кто хочет изменить поле структуры, должен будет прочитать структуру, изменить поле во временной копии и записать его обратно. Вы можете предоставить методы для чтения / записи отдельных свойств, но "foo.setBar(100, 23)" выглядит менее естественным, чем "foo(100).Bar=23". Если бы был разрешен последний синтаксис, я бы предложил, чтобы индексатор возвращал структуру с двумя закрытыми полями, "root" и "index", и свойствами для каждого поля структуры, например, для установщика для свойства Bar индексатора. будет выполнять root.setBar(индекс, значение). Индексатор также должен иметь свойство asWhwhatStructType для получения / установки структуры в целом.