protected internal (справочник по C#)
Комбинация ключевых слов protected internal
является модификатором доступа к члену. Доступ к членам с модификатором доступа protected internal может осуществляться из текущей сборки или типов, которые являются производными от содержащего класса. Сравнение модификатора protected internal
с другими модификаторами доступа см. в разделе Уровни доступности.
Пример
Член базового класса с модификатором доступа protected internal доступен из любого типа в пределах содержащей сборки. Он также доступен в производном классе, расположенном в другой сборке, только в том случае, если доступ осуществляется через переменную типа производного класса. Для примера рассмотрим следующий сегмент кода:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
protected internal int myValue = 0;
}
class TestAccess
{
void Access()
{
var baseObject = new BaseClass();
baseObject.myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
Этот пример содержит два файла, Assembly1.cs
и Assembly2.cs
.
Первый файл содержит открытый базовый класс, BaseClass
, и еще один класс, TestAccess
. BaseClass
владеет членом protected internal, myValue
, доступ к которому осуществляется типом TestAccess
.
Во втором файле попытка получить доступ к myValue
через экземпляр BaseClass
приведет к ошибке во время доступа к этому члену через экземпляр производного класса. DerivedClass
гарантирует успешное выполнение.
Элементы структуры не могут иметь модификатор protected internal
, поскольку структура не может наследоваться.
Переопределение защищенных внутренних элементов
При переопределении виртуального члена модификатор специальных возможностей переопределенного метода зависит от сборки, в которой определен производный класс.
Если производный класс определен в той же сборке, что и базовый класс, все переопределенные члены имеют protected internal
доступ. Если производный класс определен в другой сборке базового класса, переопределенные члены имеют protected
доступ.
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
protected internal virtual int GetExampleValue()
{
return 5;
}
}
public class DerivedClassSameAssembly : BaseClass
{
// Override to return a different example value, accessibility modifiers remain the same.
protected internal override int GetExampleValue()
{
return 9;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
// Override to return a different example value, since this override
// method is defined in another assembly, the accessibility modifiers
// are only protected, instead of protected internal.
protected override int GetExampleValue()
{
return 2;
}
}
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.