Sobes.tech
Junior

Кои са модификаторите за достъп в C#?

sobes.tech AI

Отговор от AI

В C# съществуват следните модификатори за достъп:

  1. public: Достъпът не е ограничен. Членовете, маркирани като public, са достъпни от всякъде, където е достъпен техният съдържащ тип.
  2. private: Достъпът е ограничен до техния съдържащ тип. Членовете, маркирани като private, са достъпни само от кода вътре в същия клас или структура.
  3. protected: Достъпът е ограничен до съдържащия тип или до типове, наследяващи от него. Членовете, маркирани като protected, са достъпни вътре в своя клас и в наследяващите класове.
  4. internal: Достъпът е ограничен до текущата сборка (.dll или .exe). Членовете, маркирани като internal, са достъпни от всякъде в същата сборка.
  5. protected internal: Достъпът е ограничен до текущата сборка или до типове, наследяващи от съдържащия тип в други сборки. Това е комбинация от protected и internal.
  6. private protected: Достъпът е ограничен до съдържащия тип или до типове, наследяващи от него само в същата сборка. Това е комбинация от private и protected.
// Пример за използване на модификатори за достъп
public class MyClass
{
    public int PublicField;        // Достъпен от всякъде
    private int PrivateField;      // Достъпен само вътре в MyClass
    protected int ProtectedField;  // Достъпен вътре в MyClass и в наследяващите класове
    internal int InternalField;    // Достъпен вътре в текущата сборка
    protected internal int ProtectedInternalField; // Достъпен вътре в текущата сборка ИЛИ в наследяващите класове
    private protected int PrivateProtectedField; // Достъпен вътре в MyClass ИЛИ в наследяващите класове в същата сборка

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

public class DerivedClass : MyClass
{
    void DerivedMethod()
    {
        ProtectedField = 20; // OK
        // PrivateField = 30; // Грешка - частно поле не е достъпно в наследяване
        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; // Грешка
        // mc.ProtectedField = 5; // Грешка
        // mc.PrivateProtectedField = 6; // Грешка
    }
}