Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Ключевое 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#.