Share via


Toegangsmodifiers (C#-programmeerhandleiding)

Alle typen en typen leden hebben een toegankelijkheidsniveau. Het toegankelijkheidsniveau bepaalt of ze kunnen worden gebruikt vanuit andere code in uw assembly of andere assembly's. Een assembly is een .dll of .exe gemaakt door een of meer .cs bestanden te compileren in één compilatie. Gebruik de volgende toegangsaanpassingen om de toegankelijkheid van een type of lid op te geven wanneer u deze declareert:

  • openbaar: Code in elke assembly heeft toegang tot dit type of lid. Het toegankelijkheidsniveau van het betreffende type bepaalt het toegankelijkheidsniveau van openbare leden van het type.
  • privé: alleen code die in hetzelfde class is gedeclareerd of struct toegang heeft tot dit lid.
  • beveiligd: Alleen code in hetzelfde class of in een afgeleide class code heeft toegang tot dit type of lid.
  • intern: Alleen code in dezelfde assembly heeft toegang tot dit type of lid.
  • beveiligd intern: alleen code in dezelfde assembly of in een afgeleide klasse in een andere assembly heeft toegang tot dit type of lid.
  • privé beveiligd: alleen code in dezelfde assembly en in dezelfde klasse of een afgeleide klasse heeft toegang tot het type of lid.
  • bestand: Alleen code in hetzelfde bestand heeft toegang tot het type of lid.

De record wijzigingsfunctie voor een type zorgt ervoor dat de compiler extra ledensynthetiseert. De record wijzigingsfunctie heeft geen invloed op de standaardtoegankelijkheid voor een record class of een record struct.

Samenvattingstabel

Locatie van beller public protected internal protected internal private protected private file
Binnen het bestand ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Binnen de klas ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Afgeleide klasse (dezelfde assembly) ✔️ ✔️ ✔️ ✔️ ✔️
Niet-afgeleide klasse (dezelfde assembly) ✔️ ✔️ ✔️
Afgeleide klasse (verschillende assembly) ✔️ ✔️ ✔️
Niet-afgeleide klasse (verschillende assembly) ✔️

In de volgende voorbeelden ziet u hoe u toegangsaanpassingen opgeeft voor een type en lid:

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

Niet alle toegangsaanpassingen zijn geldig voor alle typen of leden in alle contexten. In sommige gevallen beperkt de toegankelijkheid van het betreffende type de toegankelijkheid van de leden.

Meerdere declaraties van een gedeeltelijke klasse of gedeeltelijk lid moeten dezelfde toegankelijkheid hebben. Als een declaratie van de gedeeltelijke klasse of het lid geen wijzigingsfunctie voor toegang bevat, kunnen de andere declaraties geen wijzigingsfunctie voor toegang declareren. De compiler genereert een fout als meerdere declaraties voor de gedeeltelijke klasse of methode verschillende toegankelijkheidsproblemen declareren.

Toegankelijkheid van klassen en struct

Klassen en structs die rechtstreeks in een naamruimte zijn gedeclareerd (zijn niet genest binnen andere klassen of structs) kunnen toegang hebben publicinternal tot of file hebben. internal is de standaardinstelling als er geen toegangsaanpassing is opgegeven.

Struct-leden, inclusief geneste klassen en structs, kunnen worden gedeclareerd public, internalof private. Klassenleden, waaronder geneste klassen en structs, kunnen zijn public, , protected internal, protectedinternal, of private protectedprivate. Klasse- en struct-leden, inclusief geneste klassen en structs, hebben private standaard toegang.

Afgeleide klassen kunnen geen grotere toegankelijkheid hebben dan hun basistypen. U kunt geen openbare klasse B declareren die is afgeleid van een interne klasse A. Indien toegestaan, zou dit het effect hebben om openbaar te maken A , omdat alle protected of internal leden van A de afgeleide klasse toegankelijk zijn.

U kunt specifieke andere assembly's inschakelen voor toegang tot uw interne typen met behulp van de InternalsVisibleToAttribute. Zie Vriendenassembly's voor meer informatie.

Andere typen

Interfaces die rechtstreeks in een naamruimte zijn public gedeclareerd, kunnen of internal en interfaces, net als klassen en structs, standaard toegankelijk zijn internal . Interfaceleden zijn public standaard omdat het doel van een interface is om andere typen toegang te geven tot een klasse of struct. Declaraties van interfaceleden kunnen eventuele toegangsaanpassingen bevatten. U gebruikt toegangsaanpassingen voor interface leden om een gemeenschappelijke implementatie te bieden die nodig is voor alle implementors van een interface.

Een delegate type dat rechtstreeks in een naamruimte is gedeclareerd, heeft internal standaard toegang.

Zie de pagina Toegankelijkheidsniveaus voor meer informatie over toegangsaanpassingen.

Toegankelijkheid van leden

Leden van een class of struct (inclusief geneste klassen en structs) kunnen worden gedeclareerd met een van de zes typen toegang. Struct-leden kunnen niet worden gedeclareerd als protected, protected internalof private protected omdat structs geen ondersteuning bieden voor overname.

Normaal gesproken is de toegankelijkheid van een lid niet groter dan de toegankelijkheid van het type dat het bevat. public Een lid van een internal klasse is echter mogelijk toegankelijk van buiten de assembly als het lid interfacemethoden implementeert of virtuele methoden overschrijft die zijn gedefinieerd in een openbare basisklasse.

Het type lidveld, eigenschap of gebeurtenis moet ten minste zo toegankelijk zijn als het lid zelf. Op dezelfde manier moeten het retourtype en de parametertypen van elke methode, indexeerfunctie of gemachtigde ten minste zo toegankelijk zijn als het lid zelf. U kunt bijvoorbeeld geen methode M hebben die een public klasse C retourneert, tenzij C dit ook publicis. Op dezelfde manier kunt u geen eigenschap van het type A hebben protected als A deze is gedeclareerd als private.

Door de gebruiker gedefinieerde operators moeten altijd worden gedeclareerd als public en static. Zie Overbelasting van operatoren voor meer informatie.

Als u het toegangsniveau voor een class of struct lid wilt instellen, voegt u het juiste trefwoord toe aan de liddeclaratie, zoals wordt weergegeven in het volgende voorbeeld.

// 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; }
    }
}

Finalizers kunnen geen toegankelijkheidsaanpassingen hebben. Leden van een enum type zijn altijd publicen er kunnen geen toegangsaanpassingen worden toegepast.

De file toegangsaanpassing is alleen toegestaan op declaraties op het hoogste niveau (niet-geneste) typen.

C#-taalspecificatie

Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.

Zie ook