Каков наилучший способ представления неизменяемого списка в .NET?

Недавно я начал использовать F # для «реальной работы» и заново открыл для себя красоту неизменных структур данных, таких как различимые объединения и записи в F #. Я также обнаружил, что их довольно просто использовать в C #, тем более что они не требуют каких-либо прямых зависимостей от времени выполнения F #. Однако когда дело доходит до представления списков в этих структурах, я еще не нашел идеального решения.

Моя первая попытка состояла в том, чтобы напечатать списки как seq <'a> (IEnumerable в мире C #), который обеспечивает хороший общий интерфейс коллекции без экспорта каких-либо методов для изменения коллекции, как это делает ICollection <> и ее друзья. Однако, поскольку я не имею никакого контроля над конструктором различаемого объединения или записи, создатель экземпляра этих типов может предоставить реализацию IEnumerable <>, которая может измениться или выбросить при использовании (например, выражение LINQ) , Поэтому IEnumerable <> не окажет мне никакой помощи от компилятора в доказательстве того, что значение является неизменным и, следовательно, потокобезопасным.

Моя текущая стратегия заключается в использовании типа списка F #, который гарантирует неизменяемую коллекцию, но добавляет зависимость от среда выполнения F # и выглядит немного не так, когда используется не из проектов F #. Однако он допускает сопоставление с шаблоном F #, которое IEnumerable <> не. Это также не дает никакого выбора в реальном представлении списка, и в некоторых случаях (например, большие списки примитивных значений) представление списка F # не очень подходит.

Что я действительно хотел бы видеть, так это Тип неизменяемого массива в .NET, представленный так же компактно, как и обычный массив, но с гарантией компилятора, что он не будет изменен. Я бы приветствовал const, как в C ++, хотя, вероятно, это не очень вероятно. Между тем, есть ли другой вариант, который я пропустил?

5
задан SoftMemes 31 August 2010 в 18:31
поделиться