Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сочетание 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#.