Dela via


Å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 eller struct 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, internaleller private. Klassmedlemmar, inklusive kapslade klasser och structs, kan vara public, protected internal, , internalprotected, 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 InternalsVisibleToAttributeav . 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 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. 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.

Se även