Access Modifier (Модификатор доступа) в C#

1- Modifier в CSharp

access modifiers в CSharp определяют доступность (Рамки) в данные полей, методов, конструктора (constructor) или класса.

Существует 5 видов  access modifiers в CSharp:
  1. private
  2. protected
  3. internal
  4. protected internal
  5. public

2- Обзор access modifier

Модификатор
(Modifier)
Описание
private Доступ ограничен в рамках определения Класса. Это вид модификатора доступа по умолчанию, если нет определенного формального вида
protected Доступ ограничен в рамках определения Класса и любого подкласса унаследованного из этого класса.
internal Доступ ограничен в рамках определения Assembly текущего проекта.
protected internal Доступ ограничен в рамках определения текущего Assembly и определенном классе или подклассах.
public Не имеет ограницений при доступе в публичных членов (public)
Таблица изображенная ниже дает вам обзор про способ использования  access modifier.

С Assembly Отличается от Assembly
В определенном классе? В подклассе Вне определенного класса, вне подкласса В подклассе Вне подкласса
private Y



protected Y Y
Y
internal Y Y Y

protected internal Y Y Y

public Y Y Y Y Y
Вы можете понять более детально по примерам ниже:

3- private access modifier

private access modifier только позволяет доступ внутри класса.
Вы не можете получить доступ в члены private вне определенного класса того члена.  CSharp оповестит ошибку во время компилирования класса.

4- private constructor

Метод конструктора (constructor), метод (method), поле (field) называются членами в классе.
Если вы создаете класс, и имеет конструктор (constructor) имеет  access modifier являющийся  private, вы не можете создать объект данного класса из того  private constructor инаружи данного класса. Посмотрим изображенный пример:

5- protected access modifier

protected access modifier может иметь доступ внутри  package, или снаружи  package но должно быть через наследование.


protected access modifier только применяется для  field, method и constructor. Он не может быть применен для класса (class, interface, ..).

6- internal access modifier

internal это внутренний модфикатор доступа, который ограничивается Assembly.

Assembly это компилированный продукт вашего кода, обычно это DLL, но EXE так же можно считать assembly. Это самая маленькая единица развертывания любого проекта .NET.

Assembly обычно содержит код .NET по MSIL (Microsoft Intermediate language - Промежуточный язык) который будет компилирован в машинный код (Native code) ("JITted" - Компилирован с помощью Just-In-Time) в первый раз при выполнении на компьютере. Это компилированный код так же будет сохранен в Assembly и переиспользован для следующих вызовов.

7- protected internal access modifier

Модификатор доступа  protected internal это комбинация двух модификаторов доступа protected и internal, когда член класса имеет данный модификатор доступа, вы можете только иметь доступ к тому члену класса который определил его или к подклассам одного Assembly.

8- public access modifier

public access modifier это самый сильный и может иметь доступ везде. Имеет самые широкие рамки доступа по сравнению с другими modifier.

9- Модификатор доступа и наследственность 

В CSharp вы можете переопределить (override) метод (method) родительского класса методом c одинаковым именем и параметром, и видом возврата подкласса, но вам не позволено менять его модификатор доступа (access modifier).
Но вы можете создать метод с одинаковым именем, параметром, видом возврата, но другим модификатором доступа, если использовать ключевое словом  new, на самом деле это другой метод не связанный с методом родительского класса.
Различие между  override и new объяснены в статье  "Наследственность и полиморфизм в CSharp" вы можете посмотреть по ссылке: