Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Klíčové protected slovo je modifikátor přístupu člena.
Poznámka:
Tato stránka popisuje protected přístup. Klíčové protected slovo je také součástí protected internal a private protected modifikátorů přístupu.
Chráněný člen je přístupný v rámci své třídy a odvozenými instancemi třídy.
Porovnání protected s ostatními modifikátory přístupu najdete v tématu Úrovně přístupnosti.
Příklad 1
Chráněný člen základní třídy je přístupný v odvozené třídě pouze v případě, že k přístupu dochází prostřednictvím odvozeného typu třídy. Představte si například následující segment kódu:
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 Příkaz vygeneruje chybu, protože přistupuje k chráněnému členu prostřednictvím odkazu základní třídy (baseObject je typuBaseClass). Chráněné členy lze získat přístup pouze prostřednictvím odvozeného typu třídy nebo typů odvozených z něj.
Na rozdíl od private protectedmodifikátoru protected přístupu umožňuje přístup z odvozených tříd v libovolném sestavení. Na rozdíl od protected internal, to neumožňuje přístup z neodvozených tříd v rámci stejného sestavení.
Členy struktury nelze chránit, protože strukturu nelze zdědit.
Příklad 2
V tomto příkladu je třída DerivedPoint odvozena z Point. Proto můžete přistupovat k chráněným členům základní třídy přímo z odvozené třídy.
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
}
Pokud změníte úrovně x přístupu a yna soukromé, kompilátor vydá chybové zprávy:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
Přístup mezi sestaveními
Následující příklad ukazuje, že členy protected jsou přístupné i z odvozených tříd, přestože jsou v různých sestaveních:
// 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;
}
}
}
Tato přístupnost křížového sestavení je to, co rozlišuje protected od private protected (které omezuje přístup ke stejnému sestavení), ale je podobná protected internal (i když protected internal také umožňuje přístup ke stejnému sestavení z tříd, které nejsou odvozené).
Specifikace jazyka C#
Další informace naleznete v tématu Deklarovaná přístupnost ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.