private protected (справочник по C#)

Комбинация ключевых слов private protected является модификатором доступа к члену. К члену private protected имеют доступ типы, производные от содержащего класса, но только в пределах содержащей сборки. Сравнение модификатора private protected с другими модификаторами доступа см. в разделе Уровни доступности.

Примечание.

Модификатор доступа private protected допустим в C# 7.2 и более поздних версий.

Пример

Член базового класса private protected доступен из производных типов в содержащей сборке только в том случае, если статический тип переменной является типом производного класса. Для примера рассмотрим следующий сегмент кода:

public class BaseClass
{
    private protected int myValue = 0;
}

public class DerivedClass1 : BaseClass
{
    void Access()
    {
        var baseObject = new BaseClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 5;

        // OK, accessed through the current derived class instance
        myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
    void Access()
    {
        // Error CS0122, because myValue can only be
        // accessed by types in Assembly1
        // myValue = 10;
    }
}

Этот пример содержит два файла, Assembly1.cs и Assembly2.cs. Первый файл содержит открытый базовый класс, BaseClass, и производный от него тип, DerivedClass1. BaseClass владеет членом private protected, myValue, к которому DerivedClass1 пытается получить доступ двумя способами. Первая попытка доступа к myValue через экземпляр BaseClass приведет к ошибке. Однако попытка использовать его в качестве наследуемого члена в DerivedClass1 завершится успешно.

Во втором файле попытка получить доступ к myValue в качестве наследуемого члена DerivedClass2 приведет к ошибке, поскольку он доступен только для производных типов в Assembly1.

Если Assembly1.cs содержит InternalsVisibleToAttribute с именем Assembly2, производный класс DerivedClass2 будет иметь доступ к членам private protected, объявленным в BaseClass. InternalsVisibleTo делает члены private protected видимыми для производных классов в других сборках.

Элементы структуры не могут иметь модификатор private protected, поскольку структура не может наследоваться.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также