Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сочетание protected internal ключевых слов — это модификатор доступа к члену. Вы можете получить доступ к защищенному внутреннему члену из текущей сборки или из типов, производных от содержащего класса. Сравнение protected internal с другими модификаторами доступа см. в разделе "Уровни специальных возможностей".
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
Любой тип в содержащей сборке может получить доступ к защищенному внутреннему элементу базового класса. Производный класс, расположенный в другой сборке, может получить доступ к члену только в том случае, если доступ происходит с помощью переменной производного типа класса. Например, рассмотрим следующий сегмент кода:
// 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владеет защищенным внутренним элементом, к которому TestAccess обращается тип, myValueтак как он входит в ту же сборку.
Во втором файле попытка доступа myValue через экземпляр BaseClass создает ошибку, а доступ к этому члену через экземпляр производного класса DerivedClass завершается успешно. Это правило доступа показывает, что protected internal разрешает доступ к любому классу в одной сборке или производным классам в любой сборке, что делает его наиболее всеразрешительным для модификаторов защищенного доступа.
Элементы структуры не могут быть 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#.