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