Разработка конструктора
Примечание.
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Существует два вида конструкторов: конструкторы типов и конструкторы экземпляров.
Конструкторы типов являются статическими и выполняются средой CLR перед использованием типа. Конструкторы экземпляров запускаются при создании экземпляра типа.
Конструкторы типов не могут принимать параметры, в отличие от конструкторов экземпляров. Конструкторы экземпляров, которые не принимают никакие параметры, часто называются конструкторами без параметров.
Конструкторы предоставляют наиболее удобный способ создания экземпляров типа. Большинство разработчиков прежде всего будут искать и пытаться использовать конструктор, а не рассматривать альтернативные способы создания экземпляров (например, фабричные методы).
✔️ РЕКОМЕНДУЕТСЯ указать простые конструкторы, которые идеально подходят для использования по умолчанию.
Простой конструктор имеет очень мало параметров, и все параметры являются примитивами или перечислениями. Такие простые конструкторы повышают удобство использования платформы.
✔️ РЕКОМЕНДУЕТСЯ использовать статический фабричный метод вместо конструктора, если семантика требуемой операции не сопоставляется непосредственно с конструктором нового экземпляра или если следовать рекомендациям по разработке конструктора кажется противоестественным.
✔ РЕКОМЕНДУЕТСЯ использовать параметры конструктора, чтобы быстрее задать основные свойства.
Семантика использования пустого конструктора, за которым следуют некоторые наборы свойств, и использования конструктора с несколькими аргументами не должна отличаться.
✔️ РЕКОМЕНДУЕТСЯ использовать одно и то же имя для параметров конструктора и свойства, если параметры конструктора используются просто для установки свойства.
Единственное различие между такими параметрами и свойствами должно быть в регистре.
✔️ ВЫПОЛНИТЕ минимальную работу в конструкторе.
Конструкторы не должны выполнять много операций, отличных от захвата параметров конструктора. Затраты на любую другую обработку следует отложить до тех пор, пока это не понадобится.
✔️ РЕКОМЕНДУЕТСЯ вызвать исключения из конструкторов экземпляров, если это применимо.
✔️ РЕКОМЕНДУЕТСЯ явно объявить в классах открытый конструктор без параметров, если такой конструктор необходим.
Если вы не объявили явно какие-либо конструкторы для типа, многие языки (например, C#) автоматически добавят открытый конструктор без параметров. (Абстрактные классы получают защищенный конструктор.)
Добавление параметризованного конструктора в класс не позволяет компилятору добавить конструктор без параметров. Это часто приводит к случайным критическим изменениям.
❌ ИЗБЕГАЙТЕ явного определения конструкторов без параметров для структур.
Это помогает создать массив быстрее, так как если конструктор без параметров не определен, он не должен выполняться в каждом слоте массива. Обратите внимание, что по этой причине многие компиляторы, включая C#, запрещают структурам использовать конструкторы без параметров.
❌ НЕ вызывайте виртуальные элементы для объекта внутри конструктора.
Вызов виртуального элемента приведет к вызову переопределения самого дальнего в цепочке объекта, даже если конструктор типа более низкого уровня иерархии еще не был полностью выполнен.
Рекомендации по конструктору типов
✔️ РЕКОМЕНДУЕТСЯ сделать статические конструкторы частными.
Статический конструктор, также называемый конструктором класса, используется для инициализации типа. Среда CLR вызывает статический конструктор перед созданием первого экземпляра типа или вызывается статическими элементами для этого типа. Пользователь не управляет моментом вызова статического конструктора. Если статический конструктор не является частным, он может быть вызван кодом, находящимся за пределами среды CLR. В зависимости от операций, выполняемых в конструкторе, это может стать причиной непредвиденного поведения. Компилятор C# принудительно делает статические конструкторы частными.
❌ НЕ создавайте исключения из статических конструкторов.
Если исключение создается из конструктора типа, этот тип нельзя использовать в текущем домене приложения.
✔️ РАССМОТРИТЕ возможность инициализации статических полей встроенными средствами вместо явного использования статических конструкторов, так как среда выполнения может оптимизировать производительность типов, у которых нет явно определенного статического конструктора.
Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.
Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.