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 nebo struct má přístup k tomuto členu.
  • protected: K tomuto typu nebo členu mají přístup pouze kód ve stejném class nebo odvozeném class 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 publicinternal 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, internalnebo private. Členy třídy, včetně vnořených tříd a struktur, mohou být public, protected internal, protected, , internal, private protectednebo 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 internalnebo 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 publica 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#.

Viz také