Модификаторы доступа в C# (спецификаторы): понимание с практическими примерами
Что такое модификаторы доступа в C#?
Модификаторы доступа — ключевые слова, управляющие видимостью типов и членов типов — являются краеугольным камнем инкапсуляции в C#. Они определяют, какой код может ссылаться на класс, свойство или метод, гарантируя, что только предполагаемые части программы могут взаимодействовать с внутренними деталями реализации.
В C# существует шесть модификаторов доступа:
- Private
- Public
- Protected
- Internal
- Protected Internal
- Private Protected
В этом туториале вы узнаете:
- Что такое модификаторы доступа и зачем они нужны
- Private, Public, Protected и Internal модификаторы в деталях
- Как конструкторы инициализируют поля класса
Private модификаторы доступа
Пометка члена как private ограничивает его использование только содержащим классом. Внешний код — включая другие классы в той же сборке — не может ссылаться на private-член.
Пример Private модификатора доступа
Изменим SetTutorial в Tutorial.cs для иллюстрации этого правила. Замените ключевое слово public на private:

Теперь переключитесь на Program.cs. Компилятор подчёркнёт вызов SetTutorial красной волнистой линией, указывая, что метод недоступен из этого места.

Public модификаторы доступа
Публичные члены видимы любому коду, который может ссылаться на содержащий тип. Это значение по умолчанию для членов, не имеющих явного модификатора.
Пример Public модификатора доступа

Поскольку SetTutorial объявлен public, его можно вызвать из Program.cs без ошибок компиляции.
Protected модификаторы доступа
Член protected доступен только внутри своего класса и любых производных классов. Этот уровень доступа идеален для создания повторно используемых базовых классов, сохраняя при этом защиту внутренней реализации.
Internal модификаторы доступа
Internal-члены видны всему коду в той же сборке, но не коду в других сборках. Это полезно для компонентов библиотек, которые должны быть открыты только потребителям библиотеки.
Конструкторы в C#
Конструкторы инициализируют новый экземпляр класса. Они имеют то же имя, что и класс, не имеют возвращаемого типа и вызываются автоматически при использовании new.
- Доступ конструктора по умолчанию —
public, если не указано иное. - Конструктор не может объявлять возвращаемый тип.
Пример конструктора C#
Продемонстрируем конструктор, устанавливающий значения по умолчанию для TutorialID и TutorialName при создании объекта Tutorial.
Шаг 1) Добавьте конструктор в Tutorial.cs:

Пояснение кода
- Метод с именем
Tutorialтрактуется как конструктор. Он запускается автоматически при создании экземпляра. - Конструктор присваивает
0вTutorialIDи"Default"вTutorialName, обеспечивая согласованное начальное состояние.
В Program.cs удалите вызов SetTutorial, чтобы сфокусироваться на поведении конструктора:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication {
class Tutorial {
public int TutorialID;
public string TutorialName;
public Tutorial() {
TutorialID = 0;
TutorialName = "Default";
}
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
static void Main(string[] args) {
Tutorial pTutor = new Tutorial();
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
Пояснение кода
- Экземпляр
Tutorialсоздаётся с ключевым словомnew. - Метод
GetTutorialизвлекает значениеTutorialNameпо умолчанию, которое затем отображается черезConsole.WriteLine.
При выполнении консоль показывает:
Вывод:

Вывод подтверждает, что конструктор сработал и инициализировал TutorialName значением "Default".
Примечание: Значение "Default" исходит из конструктора, а не из внешнего кода.
Резюме
- Модификаторы доступа определяют видимость членов класса.
privateскрывает члены от всего внешнего кода.publicоткрывает члены для любого ссылающегося кода.protectedограничивает члены классом и его наследниками.internalограничивает видимость текущей сборкой.- Конструкторы инициализируют поля при инстанцировании объекта.
Язык C
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Указатели в C++: концепции, примеры и практические применения
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Функции в C++: подробное объяснение с практическими примерами кода
- Коллекции в C#: практическое руководство с реальными примерами
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Python list.count(): экспертное руководство с практическими примерами