Åtkomstmodifierare (C#-programmeringsguide)

Alla typer och typmedlemmar har en tillgänglighetsnivå. Hjälpmedelsnivån styr om annan kod i sammansättningen eller andra sammansättningar kan använda dem. 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 eller struct kan komma åt den här medlemmen.
  • class 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.

Använd filmodifieraren för typer på högsta nivån (icke-kapslade). Modifieraren file begränsar åtkomsten till kod i samma källfil. Du kan inte kombinera file modifieraren med någon åtkomstmodifierare.

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
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 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 strukturer som deklareras direkt inom ett namnområde (och inte är inneslutna i andra klasser eller strukturer) kan ha public eller internal åtkomst. Om du inte anger någon åtkomstmodifierare är internalstandardvärdet . Du kan också använda file modifieraren för att begränsa åtkomsten till den aktuella källfilen.

Du kan deklarera struct-medlemmar, inklusive kapslade klasser och structs, som public, internaleller private. Du kan deklarera klassmedlemmar, inklusive kapslade klasser och structs, som public, protected internal, protected, internal, private protectedeller private. Som standardinställning har klass- och struct-medlemmar, inklusive kapslade klasser och structs, private-åtkomst.

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 InternalsVisibleToAttributeav . Mer information finns i Vänsammansättningar.

Andra typer

Du kan deklarera gränssnitt direkt i ett namnområde som public eller internal. Precis som klasser och structs är gränssnitten 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. Använd å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

Du kan deklarera medlemmar i en class eller struct (inklusive kapslade klasser och structs) med någon av de sex typerna av åtkomst. Du kan inte deklarera struct-medlemmar som protected, protected internaleller 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. Du kan dock komma åt en public medlem i en internal klass 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.

Du måste alltid deklarera användardefinierade operatorer som public. Mer information finns i Operatoröverlagring.

Om du vill ange åtkomstnivå för en eller class en struct 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 => _wheels;
}

Finalizers kan inte ha hjälpmedelsmodifierare. Medlemmar av en enum typ är alltid public, och du kan inte använda åtkomstmodifierare.

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.

Se även