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 lubstruct
może uzyskać dostęp do tego elementu członkowskiego. - chronione: tylko kod w tym samym
class
lub pochodnymclass
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.
Wiele deklaracji częściowej klasy lub częściowej składowej musi mieć taką samą dostępność. Jeśli jedna deklaracja klasy częściowej lub składowej nie zawiera modyfikatora dostępu, inne deklaracje nie mogą zadeklarować modyfikatora dostępu. 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ą mieć public
internal
dostęp lub file
. 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
, internal
lub private
. Składowe klas, w tym zagnieżdżone klasy i struktury, mogą być , , , , lub private
private protected
. internal
protected
protected internal
public
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 A
wewnę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 internal
lub 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ę public
C
, 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 public
elementami , a nie można stosować modyfikatorów dostępu.
Modyfikator file
dostępu jest dozwolony tylko w deklaracjach typu najwyższego poziomu (bez zagnieżdżenia).
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#.