Sobes.tech
Junior

Jakie są modyfikatory dostępu w C#?

sobes.tech AI

Odpowiedź od AI

W języku C# istnieją następujące modyfikatory dostępu:

  1. public: Dostęp nie jest ograniczony. Członkowie oznaczeni jako public są dostępni z dowolnego miejsca, gdzie dostępny jest ich typ zawierający.
  2. private: Dostęp jest ograniczony do ich typu zawierającego. Członkowie oznaczeni jako private są dostępni tylko z kodu wewnątrz tej samej klasy lub struktury.
  3. protected: Dostęp jest ograniczony do typu, który je zawiera, lub do typów pochodnych od tego typu. Członkowie oznaczeni jako protected są dostępni wewnątrz swojej klasy i w klasach dziedziczących.
  4. internal: Dostęp jest ograniczony do bieżącej kompilacji (.dll lub .exe). Członkowie oznaczeni jako internal są dostępni z dowolnego miejsca w tej samej kompilacji.
  5. protected internal: Dostęp jest ograniczony do bieżącej kompilacji lub do typów pochodnych od typu zawierającego w innych kompilacjach. To połączenie protected i internal.
  6. private protected: Dostęp jest ograniczony do typu zawierającego lub do typów pochodnych od tego typu tylko w tej samej kompilacji. To połączenie private i protected.
// Przykład użycia modyfikatorów dostępu
public class MyClass
{
    public int PublicField;        // Dostępny z dowolnego miejsca
    private int PrivateField;      // Dostępny tylko wewnątrz MyClass
    protected int ProtectedField;  // Dostępny wewnątrz MyClass i w klasach dziedziczących
    internal int InternalField;    // Dostępny w ramach bieżącej kompilacji
    protected internal int ProtectedInternalField; // Dostępny w ramach bieżącej kompilacji LUB w klasach dziedziczących
    private protected int PrivateProtectedField; // Dostępny wewnątrz MyClass LUB w klasach dziedziczących w tej samej kompilacji

    void MyMethod()
    {
        PrivateField = 10; // OK
    }
}

public class DerivedClass : MyClass
{
    void DerivedMethod()
    {
        ProtectedField = 20; // OK
        // PrivateField = 30; // Błąd - prywatne pole niedostępne w dziedziczeniu
        ProtectedInternalField = 40; // OK
        PrivateProtectedField = 50; // OK
    }
}

public class AnotherClassInSameAssembly
{
    void AnotherMethod()
    {
        MyClass mc = new MyClass();
        mc.PublicField = 1; // OK
        mc.InternalField = 2; // OK
        mc.ProtectedInternalField = 3; // OK
        // mc.PrivateField = 4; // Błąd
        // mc.ProtectedField = 5; // Błąd
        // mc.PrivateProtectedField = 6; // Błąd
    }
}