Megosztás:


Hozzáférési módosítók (C# programozási útmutató)

Minden típus és típustag akadálymentességi szinttel rendelkezik. Az elérhetőségi szint szabályozza, hogy a kódodban vagy más assembly-kben lévő kódok használhatják-e őket. A szerelvény egy .dll vagy .exe , amelyet egy vagy több .cs fájl egyetlen fordításban való összeállításával hozhat létre. A következő hozzáférési módosítók használatával adhatja meg egy típus vagy tag akadálymentességét a deklaráláskor:

  • nyilvános: Bármely szerelvény kódja hozzáférhet ehhez a típushoz vagy taghoz. Az azt tartalmazó típus akadálymentességi szintje szabályozza a típus nyilvános tagjainak akadálymentességi szintjét.
  • privát: Csak ugyanabban class a deklarált kódban vagy struct a tag elérésére van lehetőség.
  • védett: Csak az azonos class vagy származtatott class kódban lévő kódok férhetnek hozzá ehhez a típushoz vagy taghoz.
  • belső: Csak az ugyanabban a szerelvényben lévő kód férhet hozzá ehhez a típushoz vagy taghoz.
  • belső védelem: Csak ugyanabban a szerelvényben vagy egy másik szerelvény származtatott osztályában lévő kód férhet hozzá ehhez a típushoz vagy taghoz.
  • privát védelem: Csak ugyanabban a szerelvényben és ugyanabban az osztályban vagy származtatott osztályban lévő kód férhet hozzá a típushoz vagy taghoz.

Használja a fájlmódosítót a legfelső szintű (nem beágyazott) típusokhoz. A file módosító korlátozza a kódhoz való hozzáférést ugyanabban a forrásfájlban. A file módosító nem kombinálható egyetlen hozzáférési módosítóval sem.

A record típus módosítója miatt a fordító további tagokat szintetizál. A record módosító nem befolyásolja az a vagy record classegy alapértelmezett akadálymentességetrecord struct.

Összegző táblázat

A hívó helye public protected internal protected internal private protected private
Az osztályon belül ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Származtatott osztály (ugyanaz a szerelvény) ✔️ ✔️ ✔️ ✔️ ✔️
Nem származtatott osztály (ugyanaz a szerelvény) ✔️ ✔️ ✔️
Származtatott osztály (eltérő szerelvény) ✔️ ✔️ ✔️
Nem származtatott osztály (eltérő szerelvény) ✔️

Az alábbi példák bemutatják, hogyan adhat meg hozzáférési módosítókat egy típuson és tagon:

public class Bicycle
{
    public void Pedal() { }
}

Nem minden hozzáférési módosító érvényes minden típusra vagy tagra minden környezetben. Bizonyos esetekben a tartalmazó típus akadálymentessége korlátozza a tagok akadálymentességét.

Egy részleges osztály vagy egy részleges tag több deklarációjának azonos akadálymentességgel kell rendelkeznie. Ha egy deklaráció nem tartalmaz hozzáférési módosítót, a többi deklaráció nem deklarálhat hozzáférés-módosítót. A fordító hibát okoz, ha a részleges osztály vagy metódus több deklarációja eltérő hozzáférési képességeket deklarál.

Osztály és szerkezet akadálymentessége

A közvetlenül névtérben deklarált osztályok és szerkezetek (amelyek nincsenek más osztályokba vagy szerkezetekbe ágyazva) rendelkezhetnek public vagy internal hozzáféréssel. Ha nem ad meg hozzáférési módosítót, az alapértelmezett érték a következő internal. A módosítóval file is korlátozhatja az aktuális forrásfájlhoz való hozzáférést.

Deklarálhatja az struct tagokat, beleértve a beágyazott osztályokat és a szerkezeteket is, mint public, internalvagy private. Deklarálhatja az osztálytagokat, beleértve a beágyazott osztályokat és a szerkezeteket, például public, protected internal, protected, internal, private protectedvagy private. Alapértelmezés szerint az osztály- és struktúratagok, köztük a beágyazott osztályok és a szerkezetek is private rendelkeznek hozzáféréssel.

A származtatott osztályok nem rendelkezhetnek nagyobb akadálymentességgel, mint az alaptípusaik. Nem deklarálhat olyan nyilvános osztályt B , amely belső osztályból Aszármazik. Ha engedélyezve van, az a nyilvánossá tételt A eredményezné, mivel az összes protected vagy internal a A tagok a származtatott osztályból érhetők el.

A használatával engedélyezheti, hogy bizonyos más szerelvények hozzáférjenek a belső típusokhoz InternalsVisibleToAttribute. További információ: Barátgyűlések.

Egyéb típusok

Közvetlenül egy névtéren belül deklarálhat interfészeket, mint public vagy internal. Az osztályokhoz és a szerkezetekhez hasonlóan az interfészek is alapértelmezés szerint internal elérhetők. A felülettagok alapértelmezés szerint azért vannak public , mert az interfész célja, hogy más típusok is hozzáférhessenek egy osztályhoz vagy szerkezethez. Az interfésztag-deklarációk tartalmazhatnak hozzáférés-módosító elemet. Használjon hozzáférési módosítókat a tagokon interface , hogy közös implementációt biztosítson az interfész összes implementátora számára.

A delegate névtérben közvetlenül deklarált típus alapértelmezés szerint rendelkezik internal hozzáféréssel.

A hozzáférési módosítókról további információt az Akadálymentességi szintek lapon talál.

A tagok akadálymentessége

A hatféle hozzáférés bármelyikével deklarálhatja egy class vagy struct (beleértve a beágyazott osztályokat és szerkezeteket is) tagjait. Nem deklarálhat strukturált tagokat protected, protected internalvagy private protected mert a szerkezetek nem támogatják az öröklést.

A tagok akadálymentessége általában nem nagyobb, mint az azt tartalmazó típus akadálymentessége. Azonban elérhet egy public tagot egy internal osztályból a szerelvényen kívülről is, ha a tag interfészmetódusokat implementál, vagy felülírja a nyilvánosan meghatározott alaposztály virtuális metódusait.

Bármely tagmező, tulajdonság vagy esemény típusának legalább olyan hozzáférhetőnek kell lennie, mint maga a tag. Hasonlóképpen, bármely metódus, indexelő vagy delegált visszatérési típusának és paramétertípusának legalább olyan elérhetőnek kell lennie, mint maga a tag. Például nem rendelkezhet olyan metódussal publicM , amely osztályt C ad vissza, kivéve, ha C az is public. Hasonlóképpen, nem rendelkezhet típustulajdonságsal protectedA , ha A deklaráltként privatevan deklarálva.

A felhasználó által definiált operátorokat publicmindig a következőképpen kell deklarálni: . További információ: Operátorok túlterhelése.

Egy vagy class több tag hozzáférési szintjének struct beállításához adja hozzá a megfelelő kulcsszót a tagdeklarációhoz az alábbi példában látható módon.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int _wheels = 3;

    // protected internal property:
    protected internal int Wheels => _wheels;
}

A véglegesítők nem rendelkezhetnek akadálymentességi módosítókkal. Egy enum típus tagjai mindig publicvannak, és nem alkalmazhat hozzáférési módosítókat.

C# nyelvspecifikáció

További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még