Вложенные типы (Руководство по программированию на C#)

Тип, определенный внутри класса, структуры или интерфейса, называется вложенным типом. Например.

public class Container
{
    class Nested
    {
        Nested() { }
    }
}

Независимо от того, является ли внешний тип классом, интерфейсом или структурой, вложенным типам по умолчанию присваивается модификатор private, из-за чего они доступны только из содержащего их типа. В предыдущем примере класс Nested недоступен для внешних типов.

Также можно указать модификатор доступа, определяющий доступность вложенного типа, как показано ниже:

  • Вложенные типы класса могут иметь модификаторы public, protected, internal, protected internal, private или private protected.

    Тем не менее при определении вложенного класса protected, protected internal или private protected внутри запечатанного класса возникает предупреждение компилятора CS0628 "Новый защищенный член объявлен в запечатанном классе".

    Также учитывайте, что внешняя доступность вложенного типа нарушает правило качества кода CA1034 "Вложенные типы не должны быть видимыми".

  • Вложенные типы структуры могут иметь модификаторы public, internal или private.

В следующем примере класс Nested определяется как открытый:

public class Container
{
    public class Nested
    {
        Nested() { }
    }
}

Вложенный (внутренний) тип может получить доступ к вмещающему (внешнему) типу. Чтобы получить доступ к вмещающему типу, передайте его в качестве аргумента в конструктор вложенного типа. Например:

public class Container
{
    public class Nested
    {
        private Container? parent;

        public Nested()
        {
        }
        public Nested(Container parent)
        {
            this.parent = parent;
        }
    }
}

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

В предыдущем объявлении полным именем класса Nested является Container.Nested. Это имя используется для создания нового экземпляра вложенного класса, как показано ниже:

Container.Nested nest = new Container.Nested();

См. также