Modyfikatory dostępu (Przewodnik programowania w języku C#)

Wszystkie typy i składowe typu mają poziom ułatwień dostępu. Poziom ułatwień dostępu określa, czy mogą być używane z innego kodu w zestawie, czy innych zestawach. Zestaw to .dll lub .exe utworzony przez kompilowanie co najmniej jednego pliku .cs w jednej kompilacji. Użyj następujących modyfikatorów dostępu, aby określić dostępność typu lub elementu członkowskiego podczas deklarowania go:

  • public: Kod w dowolnym zestawie może uzyskiwać dostęp do tego typu lub elementu członkowskiego. Poziom ułatwień dostępu zawierający typ kontroluje poziom ułatwień dostępu publicznych elementów członkowskich typu.
  • private: tylko kod zadeklarowany w tym samym class elemencie lub struct może uzyskać dostęp do tego elementu członkowskiego.
  • chronione: tylko kod w tym samym class lub pochodnym class może uzyskać dostęp do tego typu lub elementu członkowskiego.
  • wewnętrzny: tylko kod w tym samym zestawie może uzyskać dostęp do tego typu lub elementu członkowskiego.
  • chronione wewnętrzne: tylko kod w tym samym zestawie lub w klasie pochodnej w innym zestawie może uzyskać dostęp do tego typu lub składowej.
  • ochrona prywatna: tylko kod w tym samym zestawie i w tej samej klasie lub klasie pochodnej może uzyskać dostęp do typu lub składowej.
  • plik: tylko kod w tym samym pliku może uzyskać dostęp do typu lub elementu członkowskiego.

Modyfikator record typu powoduje, że kompilator syntetyzuje dodatkowe elementy członkowskie. Modyfikator record nie ma wpływu na domyślne ułatwienia dostępu dla elementu record class lub record struct.

Tabela podsumowania

Lokalizacja elementu wywołującego public protected internal protected internal private protected private file
W pliku ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
W klasie ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Klasa pochodna (ten sam zestaw) ✔️ ✔️ ✔️ ✔️ ✔️
Klasa nie pochodna (ten sam zestaw) ✔️ ✔️ ✔️
Klasa pochodna (inny zestaw) ✔️ ✔️ ✔️
Klasa nie pochodna (inny zestaw) ✔️

W poniższych przykładach pokazano, jak określić modyfikatory dostępu dla typu i elementu członkowskiego:

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

Nie wszystkie modyfikatory dostępu są prawidłowe dla wszystkich typów lub elementów członkowskich we wszystkich kontekstach. W niektórych przypadkach ułatwienia dostępu zawierającego typ ograniczają dostępność jego elementów członkowskich.

Gdy jedna deklaracja klasy częściowej lub metody częściowej nie deklaruje jej ułatwień dostępu, ma dostęp do drugiej deklaracji. Kompilator generuje błąd, jeśli wiele deklaracji dla klasy częściowej lub metody deklaruje różne możliwości dostępu.

Dostępność klas i struktur

Klasy i struktury zadeklarowane bezpośrednio w przestrzeni nazw (nie są zagnieżdżone w innych klasach lub strukturach) mogą być albo publicinternal. internal jest wartością domyślną, jeśli nie określono modyfikatora dostępu.

Składowe struktury, w tym zagnieżdżone klasy i struktury, można zadeklarować public, internallub private. Składowe klas, w tym zagnieżdżone klasy i struktury, mogą być , , , , lub privateprivate protected. internalprotectedprotected internalpublic Składowe klasy i struktury, w tym zagnieżdżone klasy i struktury, mają private domyślnie dostęp.

Klasy pochodne nie mogą mieć większej dostępności niż ich typy bazowe. Nie można zadeklarować klasy B publicznej pochodzącej z klasy Awewnętrznej . Jeśli jest to dozwolone, miałoby to wpływ na upublicznienie A , ponieważ wszystkie protected lub internal elementy członkowskie A są dostępne z klasy pochodnej.

Możesz włączyć określone inne zestawy w celu uzyskania dostępu do typów wewnętrznych przy użyciu elementu InternalsVisibleToAttribute. Aby uzyskać więcej informacji, zobacz Friend Assemblies (Przyjazne zestawy).

Inne typy

Interfejsy zadeklarowane bezpośrednio w przestrzeni nazw mogą być public lub internal , podobnie jak klasy i struktury, interfejsy domyślnie internal uzyskują dostęp. Elementy członkowskie interfejsu są public domyślnie, ponieważ celem interfejsu jest umożliwienie innym typom dostępu do klasy lub struktury. Deklaracje składowych interfejsu mogą zawierać dowolny modyfikator dostępu. Modyfikatory dostępu na interface elementach członkowskich umożliwiają zapewnienie wspólnej implementacji wymaganej przez wszystkie implementatory interfejsu.

delegate Typ zadeklarowany bezpośrednio w przestrzeni nazw ma internal dostęp domyślnie.

Aby uzyskać więcej informacji na temat modyfikatorów dostępu, zobacz stronę Poziomy ułatwień dostępu.

Ułatwienia dostępu do składowych

Elementy członkowskie obiektu class lub struct (w tym klasy zagnieżdżone i struktury) można zadeklarować przy użyciu dowolnego z sześciu typów dostępu. Nie można zadeklarować składowych struktury jako protected, protected internallub private protected , ponieważ struktury nie obsługują dziedziczenia.

Zwykle dostępność elementu członkowskiego nie jest większa niż dostępność typu, który go zawiera. Jednak składowa klasy może być dostępna spoza zestawu, public jeśli składowa internal implementuje metody interfejsu lub zastępuje metody wirtualne zdefiniowane w publicznej klasie bazowej.

Typ dowolnego pola członkowskiego, właściwości lub zdarzenia musi być co najmniej tak dostępny, jak sam element członkowski. Podobnie zwracany typ i typy parametrów dowolnej metody, indeksatora lub delegata muszą być co najmniej tak dostępne, jak sam element członkowski. Na przykład nie można mieć metody zwracającej klasę publicC, chyba że C jest to również public.M Podobnie nie można mieć protected właściwości typu A , jeśli A jest zadeklarowana jako private.

Operatory zdefiniowane przez użytkownika muszą być zawsze deklarowane jako public i static. Aby uzyskać więcej informacji, zobacz Przeciążenie operatora.

Aby ustawić poziom dostępu dla elementu class lub struct elementu członkowskiego, dodaj odpowiednie słowo kluczowe do deklaracji elementu członkowskiego, jak pokazano w poniższym przykładzie.

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

Finalizatory nie mogą mieć modyfikatorów ułatwień dostępu. enum Elementy członkowskie typu są zawsze publicelementami , a nie można stosować modyfikatorów dostępu.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też