Если операции, которые могли занять время, выполняются в конструкторе или если объект создается и затем инициализируется позже.
Например, когда построение объекта, который представляет структуру каталогов, должно население объекта и его детей быть сделанным в конструкторе. Очевидно, каталог может содержать каталоги и который в свою очередь может содержать каталоги и так далее.
Что изящное решение к этому?
Исторически сложилось так, что я закодировал свои конструкторы так, что объект готов к использованию после завершения метода конструктора. Сколько или насколько мало кода задействовано зависит от требований к объекту.
Например, скажем, мне нужно отобразить в подробностях следующий класс Company:
public class Company
{
public int Company_ID { get; set; }
public string CompanyName { get; set; }
public Address MailingAddress { get; set; }
public Phones CompanyPhones { get; set; }
public Contact ContactPerson { get; set; }
}
Так как я хочу отобразить в подробностях всю имеющуюся у меня информацию о компании, то мой конструктор будет содержать весь код, необходимый для заполнения каждого свойства. Учитывая, что это сложный тип, конструктор Company также сработает и с конструктором Address, Phones и Contact.
Теперь, если я заполняю вид списка каталогов, где мне может понадобиться только имя компании и основной номер телефона, у меня может быть второй конструктор класса, который только извлекает эту информацию и оставляет оставшуюся информацию пустой, или я могу просто создать отдельный объект, который будет содержать только эту информацию. На самом деле, это зависит только от того, как и откуда будет получена информация.
Независимо от количества конструкторов в классе, моей личной целью является выполнение любой обработки, необходимой для подготовки объекта к любым задачам, которые могут быть на него наложены.
.Отличный вопрос: приведенный вами пример, где Объект 'Directory' имеет ссылки на другие объекты 'Directory'.
В этом конкретном случае я бы переместил код для создания подчиненных объектов из конструктора (или, возможно, сделал бы первый уровень [непосредственные дочерние элементы] как рекомендует другой пост здесь), и иметь отдельный механизм «инициализации» или «сборки»).
В противном случае существует еще одна потенциальная проблема - помимо производительности - это объем памяти:
Я голосую за тонкие конструкторы и в этом случае добавляю к вашему объекту дополнительное «неинициализированное» поведение состояния.
Причина: если вы этого не сделаете, вы навязываете всем своим пользователям либо также иметь тяжелые конструкторы или динамически размещать ваш класс. В обоих случаях это может рассматриваться как неприятность.
Может быть трудно выявить ошибки таких объектов, если они становятся статическими, потому что конструктор затем запускается перед main (), и отладчику труднее отслеживать.