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