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