Sobes.tech
Junior
137
questionbank

Какие существуют модификаторы доступа в C#?

Ответ от нейросети

sobes.tech 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; // Ошибка - private поле недоступно в наследнике
        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; // Ошибка
    }
}