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