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


private protected (Руководство по C#)

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

Замечание

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

Пример

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

// Assembly1.cs
// Compile with: /target:library
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 содержит закрытый защищённый член, myValue, к которому DerivedClass1 может получить доступ как к наследуемому члену в той же сборке.

Во втором файле попытка доступа myValue в качестве унаследованного члена DerivedClass2 приведет к ошибке, так как private protected члены доступны только производным типам в одной сборке. Это ключевое отличие от protected (которое разрешает доступ к производным классам в любой сборке) и protected internal (который разрешает доступ из любого класса в одной сборке или производных классах в любой сборке).

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

Сравнение с другими модификаторами защищенного доступа

В следующей таблице перечислены основные различия между тремя модификаторами защищенного доступа:

Модификатор доступа Та же сборка, производный класс Та же сборка, непроизводный класс Разные сборки, производный класс
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • Используйте protected, чтобы производные классы в любой сборке могли получить доступ к члену.
  • Используйте protected internal, если требуется самый разрешительный доступ (любой класс в той же сборке или производный класс где угодно)
  • Используйте private protected, если требуется наиболее строгий защищённый доступ (только производные классы в той же сборке).

Элементы структуры не могут быть private protected , так как структуру нельзя наследовать.

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

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

См. также