Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Сочетание 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#.