2009-07-23 2 views
0

Я создаю неизменяемую структуру в .Net, которая содержит коллекцию только для чтения из неизменной структуры (я полностью контролирую весь дизайн). Мне не нужен метод без мутаций Add.Иммутируемая структура с коллекцией

Каков наилучший способ сделать это?

Я мог бы сделать внешнюю структуру ссылкой на ReadOnlyCollection, содержащий внутреннюю структуру. Есть ли другие варианты?

ответ

3

ReadOnlyCollection - один способ.

В зависимости от того, что вам нужно сделать с коллекцией, вы также можете представить его как IEnumerable.

+1

+1 Можно использовать простой массив, но массив изменен. Класс 'Array' имеет статический метод, называемый' AsReadOnly', который преобразует массивы в коллекции только для чтения. Он возвращает 'ReadOnlyCollection'. Нет причин для этого отличаться. – jpbochi

+0

@jpbochi: В зависимости от того, что делает, лучше использовать массив, но не хранить ссылку на него в любом поле до тех пор, пока оно не будет полностью заполнено, и не будет изменять массив и не подвергать его никакому коду, который может измените его, но вместо этого разрешите доступ к содержимому массива с помощью методов или свойств структуры. Этот подход будет иметь меньшие накладные расходы, чем использование оболочки ReadOnlyCollection, но будет иметь недостаток, заключающийся в том, что он не может предоставить пользователям этого класса что-то, что они могут использовать для доступа к массиву, не проходя через структуру. Третий подход ... – supercat

+0

... может заключаться в том, чтобы структура сохраняла 'IList', который изначально был бы привязан к массиву, но который можно было бы заменить« ReadOnlyCollection », если бы он был запрошен. Это во многих случаях позволяло бы повторять запросы для ссылки на подборку с тем же экземпляром 'ReadOnlyCollection', но с оговоркой, что, если запрос экземпляра только для чтения запрашивается для' ReadOnlyCollection', он не сможет кэшировать ссылку , – supercat