Что подразумевается под неизменным типом и неизменяемым свойством в С#? можете ли вы привести простой пример?
Неизменяемый тип и свойство в С#
Ответ 1
Неизменяемый тип - это тип, который его свойства могут быть заданы только при инициализации. Как только объект создается, ничто не может быть изменено больше. Неизменяемое свойство - просто свойство только для чтения.
В следующем примере ImmutableType
является неизменяемым типом с одним свойством Test
. Тест - это свойство только для чтения. Он может быть установлен только при построении.
class ImmutableType
{
private readonly string _test;
public string Test
{
get { return _test; }
}
public ImmutableType(string test)
{
_test = test;
}
}
См. также: Статья в Википедии и несколько стеков Вопросы переполнения по этой теме.
Ответ 2
fretje является правильным. Наиболее популярным примером неизменяемого типа является объект string
в С#. Именно по этой причине существует StringBuilder
.
Ответ 3
В дополнение к ответу @fretje выше, в С# 6 и более поздних версиях, свойства автозапуска только для геттера теперь реализованы, что позволяет для неизменяемых автоматических свойств без необходимости дополнительного явного поля поддержки private readonly
. Эквивалентный код будет сокращен до:
class ImmutableType
{
public string Test
{
get; // No Set at all, not even a private set.
}
public ImmutableType(string test)
{
Test = test; // The compiler understands this and initializes the backing field
}
}
Обратите внимание, что private set
(ближайший к неизменности может использовать автоматические свойства в более ранних версиях С#) обеспечивает только ограниченную инкапсуляцию изменения свойства из одного класса и, следовательно, не является действительно неизменным:
public string Test
{
get;
private set; // Not immutable, since this is still mutable from within the class
}
Подробнее о неизменности
Как говорили другие, immutable Property
- свойство, которое не может измениться после его установки. Установка "единственного значения" обычно выполняется в конструкторе.
An immutable Type
- это тип, в котором все (внешние видимые) свойства и поля неизменяемы - например, тип "Запись", первоначально запланированный для С# 7 (надеюсь, сейчас 8) был бы неизменным. Другими примерами неизменяемых типов являются Tuples
и все анонимные классы.
Неизменяемые поля должны быть квалифицированы с помощью ключевого слова readonly
в С# - это принудительно выполняется компилятором, чтобы гарантировать, что никакой другой код не попытается изменить поле вне конструктора.
По возможности неизменность полей, переменных и свойств рассматривается как хорошая практика, так как это значительно уменьшает площадь поверхности для ошибок (поскольку поля представляют состояние объекта, предотвращая изменение полей, уменьшает количество состояний).
Преимущество неизменности особенно важно в многопоточных программах, где два или более потока одновременно обращаются к одному и тому же объекту. Поскольку несколько потоков параллельного чтения могут безопасно обращаться к значению поля или свойства, программисту не нужно беспокоиться о проблемах безопасности потоков, связанных с изменением поля другими потоками.
Один общий недостаток неизменности при работе со сложными объектами, состоящими из нескольких скомпонованных объектов, состоит в том, что весь график нужно построить "за один раз", что может привести к запутанному коду. Общим решением здесь является использование шаблона Builder в качестве эшафота, который позволяет создавать временные, изменяемые представления в шагах, а затем получается окончательный неизменный объект в последнем шаге .Build()
.