Podczas pisania klas musimy dokładnie przemyśleć jakie zmienne, struktury, własności, metody, wyliczenia czy inne aspekty naszej klasy powinny być dostępne poza jej obrębem. Aby sterować dostępem do danego elementu w naszej klasie możemy użyć jednego ze słów kluczowych: public, private, protected, internal, protectedinternal.

public

Ten modyfikator dostępu możemy zastosować dla typów lub składowych typu. Elementy, dla których zastosujemy to słowo kluczowe nie mają ograniczeń dostępu. Możemy uzyskać dostęp do elementu z obiektu jak i dowolnej klasy pochodnej oraz z innych pakietów zewnętrznych.
Zobaczmy przykład:

1

Rys. Dostęp do zmiennej

Mamy dostęp do zmiennej z obiektu stworzonego w innej klasie.

private

Ten modyfikator dostępu możemy zastosować dla składowych typu lub typów zagnieżdżonych. Dostęp do elementu dla którego zastosujemy to słowo kluczowe ma tylko klasa lub struktura do której ten element należy.
Zobaczmy przykład:

2

Rys. Brak dostępu do zmiennej

Przy zastosowaniu modyfikatora dostępu private nie mamy dostępu do zmiennej z obiektu danej klasy.

3

Rys. Dostęp do zmiennej

Dostęp do zmiennej prywatnej mamy w ciele klasy, w której została ona zadeklarowana.

protected

Ten modyfikator dostępu możemy zastosować dla składowych typu lub typów zagnieżdżonych. Dostęp do elementu dla którego zastosujemy to słowo kluczowe ma typ definiujący i klasy pochodne. Element ten nie jest widoczny z kodu klienta.
Zobaczmy przykład:

4

Rys. Dostęp do zmiennej

Dostęp do zmiennej ma metoda Wypisz(), która znajduje się w ciele klasy, gdzie zadeklarowano zmienną z modyfikatorem protected. Natomiast obiekt tej klasy poza jej ciałem nie ma dostępu do tej zmiennej.
W odróżnieniu od zmiennej z modyfikatorem prywatnym mamy dostęp do zmiennej z klasy pochodnej.
Zobaczmy przykład:

5

Rys. Dostęp do zmiennej

Dostęp do zmiennej o modyfikatorze protected mamy w klasie pochodnej.

inretnal

Ten modyfikator dostępu możemy zastosować dla typu oraz składowych typu. Dostęp do elementu dla którego zastosujemy to słowo kluczowe ma bieżące assembly(biblioteka *.dll, plik wykonawczy *.exe). Wykorzystujemy ten modyfikator gdy tworzymy typy wewnętrzne w pakiecie i nie chcemy aby były one widoczne w innych pakietach.
Zobaczmy przykład:
Stwórzmy dwa projekty w jednym Solution:

6

Rys. Solution

W Solution mamy 2 projekty PISZ-KOD_LIB_1 oraz PISZ-KOD_LIB_2
Do projektu PISZ-KOD_LIB_2 musimy dodać referencje do projektu: PISZ-KOD_LIB_1. Aby to zrobić klikamy prawym przyciskiem myszy na folder References w projekcie o nazwie PISZ-KOD_LIB_2. Wybieramy z menu kontekstowego opcję Add Reference…

7

Rys. Menu kontekstowe

Wybieramy zakładkę z prawej strony Solution a następnie Projects. Z prawej strony wybieramy projekt o nazwie PISZ-KOD_LIB1

8

Rys. Dodanie referencji do projektu

Następnie klikamy przycisk OK. Referencja do projektu o nazwie PISZ-KOD_LIB1 została dodana.

9

Rys. Referencja do projektu PISZ-KOD_LIB1

W pierwszym projekcie tworzymy prostą klasę:

10

Rys. Klasa w pierwszym projekcie

W tej klasie tworzymy zmienną z modyfikatorem dostępu public. Sprawdźmy czy mamy dostęp do tego elementu z innego pakietu:

11

Rys. Fragment kodu

Istnieje dostęp do zmiennej o modyfikatorze dostępu public w innym pakiecie. Zmieńmy teraz modyfikator dostępu na internal:

12

Rys. Klasa w pierwszym projekcie

Sprawdźmy czy mamy dostęp do zmiennej o nazwie Id w innym pakiecie:

13

Rys. Dostępne elementy obiektu

W innym pakiecie nie mamy dostępu do elementu chronionego modyfikatorem internal

protected inretnal

Ten modyfikator dostępu możemy zastosować dla składowych typu oraz typów zagnieżdżonych. Dostęp do elementu, dla którego zastosujemy to słowo kluczowe ma definiujący go pakiet oraz klasy pochodne w innym pakiecie, zobaczmy przykład:
Wykorzystamy poprzedni projekt zmieńmy modyfikator dostępu na protected internal:

14

Rys. Klasa w pierwszym projekcie

Sprawdźmy czy mamy dostęp do elementu o nazwie Id w innym pakiecie:

15

Rys. Dostępne elementy obiektu

W bezpośredni sposób nie mamy dostępu do tego elementu. Element ten będzie dostępny w klasie pochodnej. Dodajmy zatem dziedziczenie:

16

Rys. Dostęp do zmiennej

W klasie pochodnej w innym pakiecie klasy PISZ-KOD_LIB1 mamy dostęp do elementu o nazwie Id.

Domyślne modyfikatory dostępu

Gdy nie użyjemy słowa kluczowego, które określa nam modyfikator dostępu, jest on domyślnie przydzielany. Składowe typu mają domyślnie modyfikator prywatny, natomiast typy są niejawne, wewnętrzne czyli posiadają modyfikator inretnal.
Zobaczmy przykład klasy wewnętrznej z prywatnym polem oraz metodą:

class Tree {
        double height;
        void SetHeight(double height) {
            this.height = height;
        }
    }

W tym wypadku metoda SetHeight oraz pole height jest prywatne i nie możemy ich wywołać z kodu klienta:

17

Jeżeli chcemy aby inne typy lub kod klienta mógł się odwołać do naszej zmiennej powinniśmy zastosować modulator dostępu public:

class Tree {
       double height;
       public void SetHeight(double height) {
            this.height = height;
        }
    }

W tym wypadku metoda SetHeight jest publiczna, możemy ją wywołać z kodu klienta:

18

Jeżeli chcemy aby klasa Tree była widoczna dla innych pakietów to musimy ustawić jej modyfikator dostępu na public.

Modyfikatory dostępu dla typów zagnieżdżonych

Modyfikatory dostępu takie jak private, protected oraz protected inretnal, możemy zastosować w przypadku typów zagnieżdżonych. Typ zagnieżdżony to taki typ, który jest zadeklarowany w obrębie danej klasy lub struktury. Dla przykładu, do naszej klasy Tree dodajmy prywatną zagnieżdżoną klasę Leaf:

public class Tree {
        double height;
        public void SetHeight(double height) {
            this.height = height;
       }

        private class Leaf {
            public string color;
            public string type;            
        }
 }

W przypadku typu zagnieżdżonego możemy jego modyfikator dostępu ustawić na private, lecz dla typu nie zagnieżdżonego, jakim w naszym przypadku jest Tree, nie można ustawić modyfikatora private, jedyną opcją jest public lub internal.
Kompilator zgłosi następujący błąd w przypadku gdy będziemy chcieć przypisać modyfikator dostępu private dla naszej klasy Tree:

19

Modyfikatory dostępu to podstawowe narzędzie dla hermetyzacji.