Pull to refresh

Comments 17

Я бы посоветовал убрать из кода private set;, это позволит избежать случайной ошибки сделать класс изменяемым.
Тогда не получиться инициализировать эти свойства из конструктора.
Есть ещё readonly поля.
Вы правы. Пост писался еще до 6го шарпа
Свойства readonly были еще до C# 6.

P.S. Почему статья не оформлена как перевод?
С ридонли полями примерно так же как и с private set пропертями в плане читаемости. Т.е. для того чтобы понять является ли класс изменяемым нам все равно нужно смотреть внутрь этого класса, по сигнатуре это непонятно. Тут бы помогло ключевое слово immutable.

>P.S. Почему статья не оформлена как перевод?
Я думаю свои статьи не очень правильно оформлять переводом, хотя тут не уверен насчет правил хабра.
Прошу прощения, не обратил внимания, что изначальная статья тоже ваша. Тогда помечать как перевод не нужно.
UFO just landed and posted this here
Тут я с вами (увж автор) не соглашусь, readonly пресекают изменяемость на корню а вот private set просто не позволяют изменить содержимое снаружи класса. В плане читаемости, когда видишь такое дело тут же ждешь подвоха, а нет ли тут moving parts которые провоцируются внутренним поведением класса.
В первом варианте выполнение Search(queryObject); не зависит от if, во втором зависит :)
UFO just landed and posted this here
Вторая проблема решается обильным использование тернарного условного оператора, хотя многие его не любят (незаслуженно, имхо).
Ещё ограничений:

* сериализация (например, стандартный XmlSerializer требует публичных read-write свойств и конструкторы без параметров)
* ORM (например, EntityFramework плохо дружит с read-only коллекциями)
ORM в принципе плохо дружит с неизменяемостью. Просто потому что там все построено на отслеживании изменений в сущностях.
По поводу ORM — обычная практика в таких случаях создавать интернал коллекцию для ORM и внешнюю read-only для клиентов класса
Tогда перестаёт работать конструкция типа db.Orders.Include(o => o.InternalOrderLines), вылетает с «A specified Include path is not valid. The EntityType 'Order' does not declare a navigation property with the name 'InternalOrderLines'.»
Sign up to leave a comment.

Articles