Modifikátory přístupu (Průvodce programováním v C#)
Všechny typy a členové typů mají úroveň přístupnosti. Úroveň přístupnosti určuje, jestli se dají použít z jiného kódu v sestavení nebo jiných sestaveních. Sestavení je .dll nebo .exe vytvořené kompilací jednoho nebo více .cs souborů v jedné kompilaci. Pomocí následujících modifikátorů přístupu určete přístupnost typu nebo člena, když ho deklarujete:
- public: Kód v libovolném sestavení má přístup k tomuto typu nebo členu. Úroveň přístupnosti obsahujícího typu řídí úroveň přístupnosti veřejných členů typu.
- private: Pouze kód deklarovaný ve stejném
class
nebostruct
má přístup k tomuto členu. - protected: K tomuto typu nebo členu mají přístup pouze kód ve stejném
class
nebo odvozenémclass
kódu. - internal: K tomuto typu nebo členu má přístup pouze kód ve stejném sestavení.
- chráněná vnitřní: Přístup k tomuto typu nebo členu mají přístup pouze kód ve stejném sestavení nebo v odvozené třídě v jiném sestavení.
- privátní ochrana: Přístup k typu nebo členu mají přístup pouze kód ve stejném sestavení a ve stejné třídě nebo odvozené třídě.
- soubor: K typu nebo členu mají přístup pouze kód ve stejném souboru.
record
Modifikátor typu způsobí, že kompilátor syntetizuje další členy. record
Modifikátor nemá vliv na výchozí přístupnost pro ani record class
pro record struct
.
Souhrnná tabulka
Umístění volajícího | public |
protected internal |
protected |
internal |
private protected |
private |
file |
---|---|---|---|---|---|---|---|
V souboru | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
V rámci třídy | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Odvozená třída (stejné sestavení) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Ne odvozená třída (stejné sestavení) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ | ❌ |
Odvozená třída (jiné sestavení) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ |
Ne odvozená třída (jiné sestavení) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Následující příklady ukazují, jak určit modifikátory přístupu u typu a člena:
public class Bicycle
{
public void Pedal() { }
}
Ne všechny modifikátory přístupu jsou platné pro všechny typy nebo členy ve všech kontextech. V některých případech přístupnost typu omezuje přístupnost jejích členů.
Více deklarací částečné třídy nebo částečného člena musí mít stejnou přístupnost. Pokud jedna deklarace částečné třídy nebo členu neobsahuje modifikátor přístupu, ostatní deklarace nemůžou deklarovat modifikátor přístupu. Kompilátor vygeneruje chybu, pokud více deklarací pro částečnou třídu nebo metodu deklaruje různé přístupy.
Přístupnost tříd a struktur
Třídy a struktury deklarované přímo v oboru názvů (nejsou vnořené do jiných tříd nebo struktur) mohou mít public
internal
nebo file
přístup. internal
je výchozí, pokud není zadán žádný modifikátor přístupu.
Členy struktury, včetně vnořených tříd a struktur, lze deklarovat public
, internal
nebo private
. Členy třídy, včetně vnořených tříd a struktur, mohou být public
, protected internal
, protected
, , internal
, private protected
nebo private
. Členy třídy a struktury, včetně vnořených tříd a struktur, mají private
ve výchozím nastavení přístup.
Odvozené třídy nemohou mít větší přístupnost než jejich základní typy. Nelze deklarovat veřejnou třídu B
, která je odvozena z interní třídy A
. Pokud je to povoleno, mělo by to vliv na zveřejnění A
, protože všechny protected
nebo internal
členy A
jsou přístupné z odvozené třídy.
Můžete povolit konkrétní další sestavení pro přístup k vašim interním typům pomocí nástroje InternalsVisibleToAttribute
. Další informace naleznete v tématu Přátelská sestavení.
Další typy
Rozhraní deklarovaná přímo v rámci oboru názvů mohou být public
nebo internal
a stejně jako třídy a struktury mají rozhraní výchozí internal
přístup. Členy rozhraní jsou public
ve výchozím nastavení, protože účelem rozhraní je povolit jiným typům přístup ke třídě nebo struktuře. Deklarace členů rozhraní můžou zahrnovat jakýkoli modifikátor přístupu. Modifikátory přístupu na interface
členech slouží k zajištění společné implementace potřebné všemi implementátory rozhraní.
Typ delegate
deklarovaný přímo v oboru názvů má internal
ve výchozím nastavení přístup.
Další informace o modifikátorech přístupu najdete na stránce Úrovně přístupnosti.
Přístupnost členů
Členy nebo class
struct
(včetně vnořených tříd a struktur) lze deklarovat s některým ze šesti typů přístupu. Členy struktury nelze deklarovat jako protected
, protected internal
nebo private protected
protože struktury nepodporují dědičnost.
Za normálních okolností není přístupnost člena větší než přístupnost typu, který ho obsahuje. Člen public
internal
třídy však může být přístupný mimo sestavení, pokud člen implementuje metody rozhraní nebo přepisuje virtuální metody, které jsou definovány ve veřejné základní třídě.
Typ libovolného pole, vlastnosti nebo události člena musí být alespoň tak přístupný jako samotný člen. Podobně návratový typ a typy parametrů jakékoli metody, indexeru nebo delegáta musí být alespoň tak přístupné jako samotný člen. Například nemůžete mít metodu public
M
, která vrací třídu C
, pokud C
není také public
. Podobně nemůžete mít protected
vlastnost typu A
, pokud A
je deklarována jako private
.
Uživatelem definované operátory musí být vždy deklarovány jako public
a static
. Další informace naleznete v tématu Přetížení operátoru.
Pokud chcete nastavit úroveň přístupu pro člena class
struct
, přidejte do deklarace člena odpovídající klíčové slovo, jak je znázorněno v následujícím příkladu.
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int _wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return _wheels; }
}
}
Finalizátory nemůžou mít modifikátory přístupnosti. Členy typu enum
jsou vždy public
a nelze použít žádné modifikátory přístupu.
file
Modifikátor přístupu je povolen pouze u deklarací typu nejvyšší úrovně (bez vnoření).
specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.