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


protected (справочник по C#)

Ключевое protected слово является модификатором доступа члена.

Замечание

На этой странице рассматривается protected доступ. Ключевое protected слово также является частью модификаторов protected internal и private protected доступа.

Защищенный член доступен в своем классе и по производным экземплярам классов.

Сравнение protected с другими модификаторами доступа см. в разделе "Уровни специальных возможностей".

Пример 1

Защищенный член базового класса доступен в производном классе, только если доступ происходит через производный тип класса. Например, рассмотрим следующий сегмент кода:

namespace Example1
{
    class BaseClass
    {
        protected int myValue = 123;
    }

    class DerivedClass : BaseClass
    {
        static void Main()
        {
            var baseObject = new BaseClass();
            var derivedObject = new DerivedClass();

            // Error CS1540, because myValue can only be accessed through
            // the derived class type, not through the base class type.
            // baseObject.myValue = 10;

            // OK, because this class derives from BaseClass.
            derivedObject.myValue = 10;
        }
    }
}

baseObject.myValue = 10 Инструкция вызывает ошибку, так как происходит обращение к защищенному члену через ссылку базового класса (baseObject имеет тип BaseClass). Защищенные члены доступны только через производный класс или через классы, производные от него.

В отличие от private protected, модификатор доступа protected позволяет доступ из производных классов в любой сборке. В отличие от protected internal, он не позволяет в одной сборке доступ к недочерним классам.

Элементы структуры не могут быть защищены, так как не удается наследовать структуру.

Пример 2

В этом примере класс DerivedPoint является производным от Point. Таким образом, вы можете получить доступ к защищенным членам базового класса непосредственно из производного класса.

namespace Example2
{
    class Point
    {
        protected int x;
        protected int y;
    }

    class DerivedPoint: Point
    {
        static void Main()
        {
            var dpoint = new DerivedPoint();

            // Direct access to protected members.
            dpoint.x = 10;
            dpoint.y = 15;
            Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
        }
    }
    // Output: x = 10, y = 15
}

Если изменить уровни доступа элементов x и y на private, компилятор выдаст сообщения об ошибках:

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.

Доступ между сборками

В следующем примере показано, что protected члены доступны из производных классов, даже если они находятся в разных сборках:

// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
    public class BaseClass
    {
        protected int myValue = 0;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
    using Assembly1;
    
    class DerivedClass : BaseClass
    {
        void Access()
        {
            // OK, because protected members are accessible from
            // derived classes in any assembly
            myValue = 10;
        }
    }
}

Эта возможность кросс-сборки отличается protected от private protected (которая ограничивает доступ к одной и той же сборке), но аналогична protected internal (хотя protected internal и разрешает доступ к одной сборке от непроизводных классов).

Спецификация языка C#

Дополнительные сведения см. в разделе "Объявленные специальные возможности " в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования языка C#.

См. также