Åtkomstmodifierare (C#-programmeringsguide)
Alla typer och typmedlemmar har en tillgänglighetsnivå. Hjälpmedelsnivån styr om de kan användas från annan kod i sammansättningen eller andra sammansättningar. En sammansättning är en .dll eller .exe som skapas genom kompilering av en eller flera .cs filer i en enda kompilering. Använd följande åtkomstmodifierare för att ange tillgängligheten för en typ eller medlem när du deklarerar den:
- public: Kod i alla sammansättningar kan komma åt den här typen eller medlemmen. Tillgänglighetsnivån för den innehållande typen styr tillgänglighetsnivån för offentliga medlemmar av typen.
- privat: Endast kod som deklareras i samma
class
ellerstruct
kan komma åt den här medlemmen. - skyddad: Endast kod i samma
class
eller i en härleddclass
kan komma åt den här typen eller medlemmen. - internt: Endast kod i samma sammansättning kan komma åt den här typen eller medlemmen.
- skyddat internt: Endast kod i samma sammansättning eller i en härledd klass i en annan sammansättning kan komma åt den här typen eller medlemmen.
- privat skyddad: Endast kod i samma sammansättning och i samma klass eller en härledd klass kan komma åt typen eller medlemmen.
- fil: Endast kod i samma fil kan komma åt typen eller medlemmen.
Modifieraren record
för en typ gör att kompilatorn syntetiserar extra medlemmar. Modifieraren record
påverkar inte standardtillgängligheten för en record class
eller en record struct
.
Sammanfattningstabell
Uppringarens plats | public |
protected internal |
protected |
internal |
private protected |
private |
file |
---|---|---|---|---|---|---|---|
I filen | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
I klassen | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Härledd klass (samma sammansättning) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Icke-härledd klass (samma sammansättning) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ | ❌ |
Härledd klass (annan sammansättning) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ |
Icke-härledd klass (annan sammansättning) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Följande exempel visar hur du anger åtkomstmodifierare för en typ och medlem:
public class Bicycle
{
public void Pedal() { }
}
Alla åtkomstmodifierare är inte giltiga för alla typer eller medlemmar i alla kontexter. I vissa fall begränsar tillgängligheten för den innehållande typen tillgängligheten för dess medlemmar.
Flera deklarationer av en partiell klass eller partiell medlem måste ha samma tillgänglighet. Om en deklaration av den partiella klassen eller medlemmen inte innehåller en åtkomstmodifierare kan de andra deklarationerna inte deklarera en åtkomstmodifierare. Kompilatorn genererar ett fel om flera deklarationer för den partiella klassen eller metoden deklarerar olika åtkomstmöjligheter.
Hjälpmedel för klass och struct
Klasser och structs som deklareras direkt inom ett namnområde (är inte kapslade i andra klasser eller structs) kan ha public
, internal
eller file
åtkomst. internal
är standardvärdet om ingen åtkomstmodifierare har angetts.
Struct-medlemmar, inklusive kapslade klasser och structs, kan deklareras public
, internal
eller private
. Klassmedlemmar, inklusive kapslade klasser och structs, kan vara public
, protected internal
, , internal
protected
, private protected
, eller private
. Klass- och structmedlemmar, inklusive kapslade klasser och structs, har private
åtkomst som standard.
Härledda klasser kan inte ha större tillgänglighet än sina bastyper. Du kan inte deklarera en offentlig klass B
som härleds från en intern klass A
. Om det tillåts skulle det ha effekten att offentliggöra A
, eftersom alla protected
eller internal
medlemmar i A
är tillgängliga från den härledda klassen.
Du kan aktivera specifika andra sammansättningar för att komma åt dina interna typer med hjälp InternalsVisibleToAttribute
av . Mer information finns i Vänsammansättningar.
Andra typer
Gränssnitt som deklareras direkt i ett namnområde kan vara public
eller internal
, precis som klasser och structs, gränssnitt som standard för internal
åtkomst. Gränssnittsmedlemmar är public
som standard eftersom syftet med ett gränssnitt är att göra det möjligt för andra typer att komma åt en klass eller struct. Medlemsdeklarationer för gränssnitt kan innehålla alla åtkomstmodifierare. Du använder åtkomstmodifierare på interface
medlemmar för att tillhandahålla en gemensam implementering som krävs av alla implementerare i ett gränssnitt.
En delegate
typ som deklareras direkt i ett namnområde har internal
åtkomst som standard.
Mer information om åtkomstmodifierare finns på sidan Hjälpmedelsnivåer .
Medlemstillgänglighet
Medlemmar i en class
eller struct
(inklusive kapslade klasser och structs) kan deklareras med någon av de sex typerna av åtkomst. Struct-medlemmar kan inte deklareras som protected
, protected internal
eller private protected
eftersom structs inte stöder arv.
Normalt sett är tillgängligheten för en medlem inte större än tillgängligheten för den typ som innehåller den. En medlem i en internal
klass kan dock public
vara tillgänglig utanför sammansättningen om medlemmen implementerar gränssnittsmetoder eller åsidosätter virtuella metoder som definieras i en offentlig basklass.
Typen av medlemsfält, egenskap eller händelse måste vara minst lika tillgänglig som medlemmen själv. På samma sätt måste returtypen och parametertyperna för alla metoder, indexerare eller ombud vara minst lika tillgängliga som själva medlemmen. Du kan till exempel inte ha en public
metod M
som returnerar en klass C
om inte C
också public
är . På samma sätt kan du inte ha en protected
egenskap av typen A
om A
den deklareras som private
.
Användardefinierade operatorer måste alltid deklareras som public
och static
. Mer information finns i Operatoröverlagring.
Om du vill ange åtkomstnivå för en eller struct
en class
medlem lägger du till lämpligt nyckelord i medlemsdeklarationen, som du ser i följande exempel.
// 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 kan inte ha hjälpmedelsmodifierare. Medlemmar av en enum
typ är alltid public
, och inga åtkomstmodifierare kan tillämpas.
Åtkomstmodifieraren file
tillåts endast på toppnivå (icke-kapslade) typdeklarationer.
Språkspecifikation för C#
Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.