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 ofstruct
toegang heeft tot dit lid. - beveiligd: Alleen code in hetzelfde
class
of in een afgeleideclass
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 public
internal
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
, internal
of private
. Klassenleden, waaronder geneste klassen en structs, kunnen zijn public
, , protected internal
, protected
internal
, of private protected
private
. 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 internal
of 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 public
is. 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 public
en 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.