Я создаю неизменяемую структуру в .Net, которая содержит коллекцию только для чтения из неизменной структуры (я полностью контролирую весь дизайн). Мне не нужен метод без мутаций Add.Иммутируемая структура с коллекцией
Каков наилучший способ сделать это?
Я мог бы сделать внешнюю структуру ссылкой на ReadOnlyCollection
, содержащий внутреннюю структуру. Есть ли другие варианты?
+1 Можно использовать простой массив, но массив изменен. Класс 'Array' имеет статический метод, называемый' AsReadOnly', который преобразует массивы в коллекции только для чтения. Он возвращает 'ReadOnlyCollection'. Нет причин для этого отличаться. – jpbochi
@jpbochi: В зависимости от того, что делает, лучше использовать массив, но не хранить ссылку на него в любом поле до тех пор, пока оно не будет полностью заполнено, и не будет изменять массив и не подвергать его никакому коду, который может измените его, но вместо этого разрешите доступ к содержимому массива с помощью методов или свойств структуры. Этот подход будет иметь меньшие накладные расходы, чем использование оболочки ReadOnlyCollection, но будет иметь недостаток, заключающийся в том, что он не может предоставить пользователям этого класса что-то, что они могут использовать для доступа к массиву, не проходя через структуру. Третий подход ... – supercat
... может заключаться в том, чтобы структура сохраняла 'IList', который изначально был бы привязан к массиву, но который можно было бы заменить« ReadOnlyCollection », если бы он был запрошен. Это во многих случаях позволяло бы повторять запросы для ссылки на подборку с тем же экземпляром 'ReadOnlyCollection', но с оговоркой, что, если запрос экземпляра только для чтения запрашивается для' ReadOnlyCollection', он не сможет кэшировать ссылку , – supercat