Существуют ли в .NET классы неизменяемых коллекций, у которых нет функций мутации?C#

Место общения программистов C#
Ответить
Anonymous
 Существуют ли в .NET классы неизменяемых коллекций, у которых нет функций мутации?

Сообщение Anonymous »

Я ищу некоторые неизменяемые коллекции в C#, в частности, тип List/array и тип set/hashset. Я уточняю, существуют ли «встроенные» типы .NET, которые делают то, что я хочу (я понимаю, что создать свои собственные не составит труда)
Под «неизменяемыми» я имею в виду, что вы должны невозможно изменить экземпляр коллекции после создания экземпляра (без добавления, удаления, изменения порядка элементов и т. д. - не то чтобы меня заботил порядок)
Теперь в .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»