Поделиться через


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#.

См. также