private protected (справочник по C#)
Комбинация ключевых слов private protected
является модификатором доступа к члену. К члену private protected имеют доступ типы, производные от содержащего класса, но только в пределах содержащей сборки. Сравнение модификатора private protected
с другими модификаторами доступа см. в разделе Уровни доступности.
Примечание.
Модификатор доступа private protected
допустим в C# 7.2 и более поздних версий.
Пример
Член базового класса private protected доступен из производных типов в содержащей сборке только в том случае, если статический тип переменной является типом производного класса. Для примера рассмотрим следующий сегмент кода:
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
владеет членом private protected, myValue
, к которому DerivedClass1
пытается получить доступ двумя способами. Первая попытка доступа к myValue
через экземпляр BaseClass
приведет к ошибке. Однако попытка использовать его в качестве наследуемого члена в DerivedClass1
завершится успешно.
Во втором файле попытка получить доступ к myValue
в качестве наследуемого члена DerivedClass2
приведет к ошибке, поскольку он доступен только для производных типов в Assembly1.
Если Assembly1.cs
содержит InternalsVisibleToAttribute с именем Assembly2
, производный класс DerivedClass2
будет иметь доступ к членам private protected
, объявленным в BaseClass
. InternalsVisibleTo
делает члены private protected
видимыми для производных классов в других сборках.
Элементы структуры не могут иметь модификатор private protected
, поскольку структура не может наследоваться.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.