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


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

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

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

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

// 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 содержит имена, Assembly2производный InternalsVisibleToAttribute класс DerivedClass2 имеет доступ к private protected членам, объявленным в BaseClass. InternalsVisibleTo делает private protected элементы видимыми для производных классов в других сборках.

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

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

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

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

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

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

См. также