Подтвердить что ты не робот

Неизменяемый тип и свойство в С#

Что подразумевается под неизменным типом и неизменяемым свойством в С#? можете ли вы привести простой пример?

4b9b3361

Ответ 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().