Под «неизменяемыми» я имею в виду, что вы должны невозможно изменить экземпляр коллекции после создания экземпляра (без добавления, удаления, изменения порядка элементов и т. д. - не то чтобы меня заботил порядок)
Теперь в .NET есть коллекции ImmutableXXX, но эти для меня есть главный недостаток: все еще включая функции мутации их изменяемых эквивалентов. Например, ImmutableList имеет функцию Add. Что еще хуже, эти функции «работают», но делают нечто совершенно отличное от того, что они делают в изменяемых версиях; вместо изменения текущего экземпляра они возвращают новый экземпляр коллекции, который является копией текущего с примененной операцией.
Проблема в том, что это настраивает вашу команду для не сразу очевидные ошибки. Если у вас есть класс, содержащий свойства, которые являются неизменяемыми коллекциями, например:
Код: Выделить всё
class Class
{
public ImmutableList Students { get; init; }
}
Код: Выделить всё
Programming101.Studends.Add("fred");
Это особенно плохо, если вы реорганизуют класс, чтобы сделать его неизменяемым - я думаю, это не такое уж редкое явление.
Более того, неизменяемые коллекции кажутся немного разбросанными по .Net. Например, ImmutableXXX не имеет варианта set или hashSet. Существует FrozenSet, и, по крайней мере, он выдает исключение, если вы попытаетесь вызвать метод Add (реализован только для удовлетворения реализации ICollection), но коллекции FrozenXXX включают только Set и Dictionary..
Другим вариантом, конечно, было бы использование интерфейсов IReadonlyXXX, таких как IReadonlyList.
Но проблема в том, что если в В моем приведенном выше примере я использовал его вместо ImmutableList, тогда кто-то мог инициализировать Студентов с помощью List, а затем отдельно изменить этот список позже (на который они сохранили ссылку за пределами класса объект), нарушая неизменяемость класса.
Единственный другой вариант — гарантировать, что студенты всегда создаются внутри класса, но это означает, что если вы хотите инициализировать экземпляр класса с существующим коллекцию студентов, эту коллекцию придется скопировать. Одним из преимуществ неизменяемых объектов (например, коллекций ImmutableXXX) является то, что вы можете использовать их для инициализации других неизменяемых объектов, а новый объект может просто ссылаться на существующую коллекцию Immutable, зная, что ее невозможно изменить.
Итак, вкратце: я ищу что-то функционально эквивалентное коллекциям ImmutableXXX, но не имеющее функций мутации или, по крайней мере, выдающее исключения. если ты попробуешь позвонить их. Таким образом, FrozenSet удовлетворил бы мою потребность в наборе, но, похоже, не существует эквивалента List/Array?
Подробнее здесь: https://stackoverflow.com/questions/793 ... n-function
Мобильная версия