Поделиться через


Дизайн конструктора

Замечание

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Существует два типа конструкторов: конструкторы типов и конструкторы экземпляров.

Конструкторы типов являются статическими и выполняются средой CLR перед использованием типа. Конструкторы экземпляров выполняются при создании экземпляра типа.

Конструкторы типов не могут принимать параметры. Конструкторы экземпляров могут. Конструкторы экземпляров, которые не принимают никаких параметров, часто называются конструкторами без параметров.

Конструкторы — это самый естественный способ создания экземпляров типа. Большинство разработчиков сначала будут искать конструктор и стараться его использовать, прежде чем будут рассматривать альтернативные способы создания экземпляров (например, методы фабрики).

✔️ Рассмотрите возможность предоставления простых, идеально стандартных конструкторов.

Простой конструктор имеет очень небольшое количество параметров, и все параметры являются примитивами или перечислениями. Такие простые конструкторы повышают удобство использования платформы.

✔️ Обдумайте использование статического фабричного метода вместо конструктора, если семантика требуемой операции не сопоставляется непосредственно с созданием нового экземпляра или если соблюдение рекомендаций по проектированию конструктора кажется неестественным.

✔️ Используйте параметры конструктора как удобный способ задания основных свойств.

Не должно быть разницы в семантике между использованием пустого конструктора, за которым следует некоторые наборы свойств и использование конструктора с несколькими аргументами.

✔️ Используйте то же имя для параметров конструктора и свойства, если параметры конструктора используются для простого задания свойства.

Единственное различие между такими параметрами и свойствами должно заключаться в регистре.

✔️ Выполните минимальную работу в конструкторе.

Конструкторы не должны выполнять большую работу, кроме записи параметров конструктора. Стоимость любой другой обработки должна быть отложена до тех пор, пока не потребуется.

✔️ Следует выбрасывать исключения из конструкторов экземпляров, если это уместно.

✔️ Явно объявляйте публичный конструктор без параметров в классах, если такой конструктор необходим.

Если вы явно не объявляете конструкторы в типе, многие языки (например, C#) автоматически добавляют открытый конструктор без параметров. (Абстрактные классы получают защищенный конструктор.)

Добавление параметризованного конструктора в класс запрещает компилятору добавлять конструктор без параметров. Это часто приводит к случайным ломающим изменениям.

❌ ИЗБЕГАЙТЕ явного определения конструкторов без параметров на структуры.

Это ускоряет создание массива, так как если конструктор без параметров не определен, он не должен выполняться на каждом слоте в массиве. Обратите внимание, что многие компиляторы, включая C#, не позволяют структуры иметь конструкторы без параметров по этой причине.

❌ Избегайте вызова виртуальных членов объекта внутри конструктора.

Вызов виртуального члена приведет к вызову наиболее производного переопределения, даже если выполнение конструктора наиболее производного типа еще не завершено.

Рекомендации по конструктору типов

✔️ Сделайте статические конструкторы закрытыми.

Статический конструктор, также называемый конструктором классов, используется для инициализации типа. CLR вызывает статический конструктор до создания первого экземпляра типа или вызова любого статического элемента этого типа. Пользователь не имеет контроля над вызовом статического конструктора. Если статический конструктор не является закрытым, его можно вызвать по коду, отличному от среды CLR. В зависимости от операций, выполняемых в конструкторе, это может привести к неожиданному поведению. Компилятор C# заставляет статические конструкторы быть закрытыми.

❌ НЕ вызывайте исключения из статических конструкторов.

Если исключение создается из конструктора типов, тип недоступен в текущем домене приложения.

✔️ Рассмотрите возможность инициализации статических полей непосредственно в коде, а не явно с помощью статических конструкторов, так как среда выполнения может оптимизировать производительность типов, которые не имеют явно определенного статического конструктора.

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также