неизменяемые классы легче рассуждать, особенно в многозадачном приложении, но они, как правило, платят за производительность (потому что, когда вам нужно изменить значение поля, вам нужно снова построить весь класс с новым значением).
Таким образом, вы могли бы быть в порядке или (в зависимости от того, что вы кодируете) лучше иметь свойства, но, как обычно, нет серебряной пули.
Настраиваемые свойства также являются единственным способом кодирования объектов для некоторых конкретных платформ или библиотек (например, ORM, таких как NHibernate), потому что вы не можете контролировать, как библиотека / каркас инициализирует объект.
Что касается конструкторов, в C # 4 есть необязательные параметры , которые могут помочь вам избежать длинной цепочки конструкторов, а также гораздо яснее сообщить, что параметры являются необязательными.
Однако я не могу вспомнить многих случаев, когда вы заканчивали бы классами с длинным списком необязательных параметров. Если вы обнаружите, что вы слишком часто кодируете такие классы (особенно с помощью шаблона компоновщика, который очень элегантно выглядит на стороне потребителя класса, но усложняет код самого класса), вы можете использовать неправильный дизайн. Вы уверены, что не просите у своих классов слишком много обязанностей?