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:
- public: Dostęp nie jest ograniczony. Członkowie oznaczeni jako
publicsą dostępni z dowolnego miejsca, gdzie dostępny jest ich typ zawierający. - private: Dostęp jest ograniczony do ich typu zawierającego. Członkowie oznaczeni jako
privatesą dostępni tylko z kodu wewnątrz tej samej klasy lub struktury. - protected: Dostęp jest ograniczony do typu, który je zawiera, lub do typów pochodnych od tego typu. Członkowie oznaczeni jako
protectedsą dostępni wewnątrz swojej klasy i w klasach dziedziczących. - internal: Dostęp jest ograniczony do bieżącej kompilacji (.dll lub .exe). Członkowie oznaczeni jako
internalsą dostępni z dowolnego miejsca w tej samej kompilacji. - 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
protectediinternal. - 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
privateiprotected.
// 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
}
}