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

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

3 ответов


неизменяемый тип-это тип, свойства которого можно задать только при инициализации. Как только объект создан, ничего уже нельзя изменить. Неизменяемое свойство - это просто свойство только для чтения.

В следующем примере, ImmutableType является неизменяемым типом с одним свойством Test. Тест-это свойство только для чтения. Его можно установить только при строительстве.

class ImmutableType
{
    private readonly string _test;
    public string Test
    {
        get { return _test; }
    }

    public ImmutableType(string test)
    {
        _test = test;
    }
}

см. также: Википедия и некоторые Стек переполнения вопросы по теме.


fretje правильно. Самый популярный пример неизменяемого типа .


в дополнение к ответу @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() шаг.