Основным преимуществом неизменяемости является то, что не нужно отслеживать владение неизменяемыми объектами. Они просто существуют до тех пор, пока они кому-нибудь нужны, а затем исчезают в ничто, когда они больше не нужны. Хотя использование сборщика мусора во многих случаях означает, что нет необходимости писать какой-либо код, прямо связанный с владением изменяемыми объектами (за исключением тех, которые реализуют IDisposable
), во многих случаях очень сложно написать правильный код, в котором объекты которые имеют изменяемое состояние, не имеют одного четко определенного «владельца». Путаница в том, кому принадлежит состояние изменчивых объектов, может быть очень частым источником ошибок; при использовании неизменяемых объектов (кроме нескольких, которые реализуют IDisposable
), обычно можно игнорировать проблемы владения.
Другой момент, который следует учитывать, заключается в том, что гораздо проще рассуждать об изменчивой ссылке на семантически неизменяемый объект или неизменяемой ссылке на изменяемый объект, чем об изменчивой ссылке на изменяемый объект. Если есть изменяемая ссылка на изменяемые объекты, часто может быть неясно, является ли правильный подход к обновлению состояния простым изменением объекта напрямую или копированием его состояния в новый объект, изменением этого и обновлением ссылки. В некоторых случаях могут возникать обстоятельства, требующие каждого типа операции (например, List<T>
, который иногда заменяет массив на больший, но обычно выполняет обновления на месте), но такой подход работает только в том случае, если тип поддерживает исключительный тип. контроль над изменяемыми объектами. Часто более полезно либо иметь неизменяемую ссылку на изменяемый тип (в этом случае код может предоставлять ссылку, возможно, через оболочку только для чтения, другим объектам, которые хотят получить «живое представление» своего состояния), либо иметь изменяемая ссылка на объект, который является неизменным или, как минимум, никогда не будет видоизменяться во время существования ссылки.