Неизменяемый тип и свойство в C#
Что подразумевается под неизменяемым типом и неизменяемым свойством в C# ? можете привести простой пример?
3 ответов
неизменяемый тип-это тип, свойства которого можно задать только при инициализации. Как только объект создан, ничего уже нельзя изменить. Неизменяемое свойство - это просто свойство только для чтения.
В следующем примере, ImmutableType
является неизменяемым типом с одним свойством Test
. Тест-это свойство только для чтения. Его можно установить только при строительстве.
class ImmutableType
{
private readonly string _test;
public string Test
{
get { return _test; }
}
public ImmutableType(string test)
{
_test = test;
}
}
см. также: Википедия и некоторые Стек переполнения вопросы по теме.
в дополнение к ответу @fretje выше, в C#6 и позже,getter - только авто свойства теперь реализованы, что позволяет использовать неизменяемые авто-свойства без необходимости дополнительного явного 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
(ближайший к неизменяемости может получить с помощью auto properties в более ранних версиях C#) только обеспечивает ограниченную инкапсуляцию изменения свойства изнутри того же класса и, следовательно, не является действительно неизменным:
public string Test
{
get;
private set; // Not immutable, since this is still mutable from within the class
}
подробнее о неизменяемости
как говорили другие, an immutable Property
- это свойство, которое не может измениться после его установки. Установка 'only value' обычно выполняется в конструкторе.
An immutable Type
- Это тип, в котором все (внешне видимые) свойства и поля неизменяемы - например, тип "запись", первоначально запланированный для C#7 (надеюсь, теперь 8) был бы неизменяемым типом. Другими примерами неизменяемых типов являются Tuples
, а всего анонимные классы.
неизменяемые поля должны быть квалифицированы readonly
ключевое слово в C# - это принудительно компилятором, чтобы убедиться, что никакой другой код не пытается изменить поле вне конструктора.
везде, где это возможно, неизменность полей, переменных и свойств считается хорошей практикой, так как это значительно уменьшает площадь поверхности для ошибок (так как поля представляют состояние объекта, предотвращение изменения полей уменьшает количество состояний).
преимущество неизменяемости особенно важно в многопоточных программах, где два или более потока одновременно обращаются к одному и тому же объекту. Поскольку несколько потоков одновременного чтения могут безопасно получить доступ к значению поля или свойства, программисту не нужно беспокоиться о проблемах безопасности потоков, связанных с изменением поле другими потоками.
один общий недостаток неизменности при работе со сложными объектами, состоящими из нескольких составленных объектов, заключается в том, что весь график должен быть построен "за один раз", что может привести к беспорядочному коду. Общим решением здесь является использование шаблона как эшафот, который позволяет переходному, изменяемому представлению быть построенным в шагах, и после этого окончательный, неизменяемый объект получен в окончательном .Build()
шаг.