Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ключевое protected слово является модификатором доступа члена.
Замечание
В этой статье рассматривается protected доступ. Ключевое protected слово также является частью модификаторов protected internal и private protected доступа.
Вы можете получить доступ к защищенному члену в своем классе и по производным экземплярам классов.
Сравнение protected с другими модификаторами доступа см. в разделе "Уровни специальных возможностей".
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
Доступ к защищенному члену базового класса в производном классе можно получить только в том случае, если доступ происходит через производный тип класса. Например, рассмотрим следующий сегмент кода:
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этого, он не разрешает доступ к непроизводным классам в одной сборке.
Нельзя объявлять элементы структуры защищенными, так как структуры не могут наследоваться.
В этом примере класс 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
}
Если изменить уровни доступа и yзакрытые, компилятор возвращает сообщения об ошибкахx:
'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#.