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


защищенный внутренний (справочник по C#)

Сочетание 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#.

См. также