Разработка конструктораConstructor Design

Существует два вида конструкторов: конструкторы типов и конструкторы экземпляров.There are two kinds of constructors: type constructors and instance constructors.

Конструкторы типов являются статическими и выполняются средой CLR перед использованием типа.Type constructors are static and are run by the CLR before the type is used. Конструкторы экземпляров запускаются при создании экземпляра типа.Instance constructors run when an instance of a type is created.

Конструкторы типов не могут принимать параметры.Type constructors cannot take any parameters. Конструкторы экземпляров могут.Instance constructors can. Конструкторы экземпляров, которые не принимают параметры, часто называются конструкторами без параметров.Instance constructors that don’t take any parameters are often called parameterless constructors.

Конструкторы — это наиболее естественный способ создания экземпляров типа.Constructors are the most natural way to create instances of a type. Большинство разработчиков будут искать и пытаться использовать конструктор, прежде чем они рассчитают альтернативные способы создания экземпляров (например, фабричные методы).Most developers will search and try to use a constructor before they consider alternative ways of creating instances (such as factory methods).

✔️ Рассмотрите возможность предоставления простых, идеально используемых по умолчанию конструкторов.✔️ CONSIDER providing simple, ideally default, constructors.

Простой конструктор имеет очень небольшое количество параметров, и все параметры являются примитивами или перечислениями.A simple constructor has a very small number of parameters, and all parameters are primitives or enums. Такие простые конструкторы увеличивают удобство использования платформы.Such simple constructors increase usability of the framework.

✔️ РЕКОМЕНДУЕТСЯ использовать статический фабричный метод вместо конструктора, если семантика требуемой операции не сопоставляется непосредственно с построением нового экземпляра или если следовать рекомендациям по проектированию конструктора, которые не являются естественными.✔️ CONSIDER using a static factory method instead of a constructor if the semantics of the desired operation do not map directly to the construction of a new instance, or if following the constructor design guidelines feels unnatural.

✔️ использовать параметры конструктора в качестве сочетаний клавиш для задания основных свойств.✔️ DO use constructor parameters as shortcuts for setting main properties.

В семантике между использованием пустого конструктора, за которым следуют некоторые наборы свойств, и использование конструктора с несколькими аргументами не должно быть различий.There should be no difference in semantics between using the empty constructor followed by some property sets and using a constructor with multiple arguments.

✔️ использовать одно и то же имя для параметров конструктора и свойство, если параметры конструктора используются для просто установки свойства.✔️ DO use the same name for constructor parameters and a property if the constructor parameters are used to simply set the property.

Единственное различие между такими параметрами и свойствами должно быть в регистре.The only difference between such parameters and the properties should be casing.

✔️ ВЫПОЛНИТЬ минимальную работу в конструкторе.✔️ DO minimal work in the constructor.

Конструкторы не должны выполнять много операций, кроме сбора параметров конструктора.Constructors should not do much work other than capture the constructor parameters. Стоимость любой другой обработки должна быть отложена до необходимости.The cost of any other processing should be delayed until required.

✔️ Вызывайте исключения из конструкторов экземпляров, если это уместно.✔️ DO throw exceptions from instance constructors, if appropriate.

✔️ явно объявите открытый конструктор без параметров в классах, если такой конструктор является обязательным.✔️ DO explicitly declare the public parameterless constructor in classes, if such a constructor is required.

Если вы не объявили явно какие-либо конструкторы в типе, многие языки ( C#такие как) автоматически добавляют открытый конструктор без параметров.If you don’t explicitly declare any constructors on a type, many languages (such as C#) will automatically add a public parameterless constructor. (Абстрактные классы получают защищенный конструктор.)(Abstract classes get a protected constructor.)

Добавление параметризованного конструктора в класс не позволяет компилятору добавлять конструктор без параметров.Adding a parameterized constructor to a class prevents the compiler from adding the parameterless constructor. Это часто приводит к случайным критическим изменениям.This often causes accidental breaking changes.

❌ избежать явного определения конструкторов без параметров для структур.❌ AVOID explicitly defining parameterless constructors on structs.

Это делает создание массива быстрее, так как если конструктор без параметров не определен, он не должен выполняться в каждом слоте массива.This makes array creation faster, because if the parameterless constructor is not defined, it does not have to be run on every slot in the array. Обратите внимание, что многие компиляторы, включая C#, не разрешают структурам использовать конструкторы без параметров по этой причине.Note that many compilers, including C#, don’t allow structs to have parameterless constructors for this reason.

❌ избежать вызова виртуальных членов для объекта внутри его конструктора.❌ AVOID calling virtual members on an object inside its constructor.

Вызов виртуального члена приведет к вызову наиболее производного переопределения, даже если конструктор самого производного типа еще не был полностью запущен.Calling a virtual member will cause the most derived override to be called, even if the constructor of the most derived type has not been fully run yet.

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

✔️ сделать статические конструкторы частными.✔️ DO make static constructors private.

Статический конструктор, также называемый конструктором класса, используется для инициализации типа.A static constructor, also called a class constructor, is used to initialize a type. Среда CLR вызывает статический конструктор перед созданием первого экземпляра типа или вызовом любых статических членов этого типа.The CLR calls the static constructor before the first instance of the type is created or any static members on that type are called. Пользователь не может управлять при вызове статического конструктора.The user has no control over when the static constructor is called. Если статический конструктор не является закрытым, он может быть вызван кодом, отличным от CLR.If a static constructor is not private, it can be called by code other than the CLR. В зависимости от операций, выполняемых в конструкторе, это может привести к непредвиденному поведению.Depending on the operations performed in the constructor, this can cause unexpected behavior. C# Компилятор принудительно применяет к закрытию статические конструкторы.The C# compiler forces static constructors to be private.

❌ не вызывайте исключения из статических конструкторов.❌ DO NOT throw exceptions from static constructors.

Если исключение создается из конструктора типов, этот тип не может использоваться в текущем домене приложения.If an exception is thrown from a type constructor, the type is not usable in the current application domain.

✔️ Рассмотрите возможность инициализации статических полей встроенным способом, а не явно используя статические конструкторы, так как среда выполнения может оптимизировать производительность типов, у которых нет явно определенного статического конструктора.✔️ CONSIDER initializing static fields inline rather than explicitly using static constructors, because the runtime is able to optimize the performance of types that don’t have an explicitly defined static constructor.

Части © 2005, 2009 Корпорация Майкрософт. Все права защищены.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

См. также разделSee also