Private void c что это
Все поля, методы и остальные компоненты класса имеют модификаторы доступа . Модификаторы доступа позволяют задать допустимую область видимости для компонентов класса. То есть модификаторы доступа определяют контекст, в котором можно употреблять данную переменную или метод.
В языке C# применяются следующие модификаторы доступа:
private : закрытый или приватный компонент класса или структуры. Приватный компонент доступен только в рамках своего класса или структуры.
private protected : компонент класса доступен из любого места в своем классе или в производных классах, которые определены в той же сборке.
file : добавлен в версии C# 11 и применяется к типам, например, классам и структурам. Класс или структура с такми модификатором доступны только из текущего файла кода.
protected : такой компонент класса доступен из любого места в своем классе или в производных классах. При этом производные классы могут располагаться в других сборках.
internal : компоненты класса или структуры доступен из любого места кода в той же сборке, однако он недоступен для других программ и сборок.
protected internal : совмещает функционал двух модификаторов protected и internal . Такой компонент класса доступен из любого места в текущей сборке и из производных классов, которые могут располагаться в других сборках.
public : публичный, общедоступный компонент класса или структуры. Такой компонент доступен из любого места в коде, а также из других программ и сборок.
Стоит отметить, что эти модификаторы могут применяться как к компонентам класса, так и к компонентам структуры за тем исключением, что структуры не могут использовать модификаторы private protected , protected и protected internal , поскольку структуры не могут быть унаследованы.
Все классы и структуры, определенные напрямую вне других типов (классов и структур) могут иметь только модификаторы public , file или internal .
Мы можем явно задать модификатор доступа, а можем его и не указывать:
Если для компонентов не определен модификатор доступа, то по умолчанию для них применяется модификатор private . Например, в примере выше переменная name неявно будет иметь модификатор private .
Классы и структуры, которые объявлены без модификатора и которые расположены вне других типов, по умолчанию имеют доступ internal , а вложенные классы и структуры, как и остальные компоненты классов/структур имеют модификатор private . Например:
Здесь класс Phone не является вложенным ни в один другой класс/структуру, поэтому неявно имеет модификатор internal . А структура Camera является вложенной, поэтому, как и другие компоненты класса, неявно имеет модификатор private
Модификаторы в рамках текущего проекта
Посмотрим на примере и создадим следующий класс State:
Так как класс State не имеет явного модификатора, по умолчанию он имеет модификатор internal , поэтому он будет доступен из любого места данного проекта, однако не будет доступен из других программ и сборок.
Класс State имеет шесть полей для каждого уровня доступа. Плюс одна переменная без модификатора, которая является закрытой (private) по умолчанию. А также определено семь методов с разными модификаторами, которые выводят значения соответствующих переменных на консоль. Поскольку все модификаторы позволяют использовать компоненты класса внутри данного класса, то и все переменные класса, в том числе закрытые, у нас доступны всем его методам, так как все находятся в контексте класса State.
Теперь посмотрим, как мы сможем использовать переменные класса State в другом классе, который, допустим, будет называться StateConsumer и который расположен в том же проекте :
Таким образом, в классе StateConsumer мы смогли только обратиться к переменным internalVar, protectedInternalVar и publicVar, так как их модификаторы позволяют использовать в данном контексте.
Аналогично дело обстоит и с методами:
Здесь нам оказались доступны только три метода: PrintInternal, PrintProtectedInternal, PrintPublic, которые имееют соответственно модификаторы internal, protected internal, public.
Модификаторы в рамках сборок
Допустим, у нас есть проект (и соответственно сборка) MyLib, в которой определены три класса:
Здесь классы DefaultState и InternalState имеют модификатор internal , поэтому доступны только в текущем проекте.
Класс PublicState модификатором public доступен из других проектов. Однако его метод PrintInternal() доступен только в текущем проекте. Вне текущего проекта доступен только его метод PrintPublic и PrintProtectedInternal() (доступен в другом проекте только в классах-наследниках).
Допустим, мы подключаем сборку этого проекта MyLib в другой проект, где есть класс StateConsumer:

В классе StateConsumer есть доступ только к классу PublicState и его методу PrintPublic , потому что они имеют модификатор public . К остальной функциональности подключенной сборки StateConsumer доступа не имеет.
Благодаря такой системе модификаторов доступа можно скрывать некоторые моменты реализации класса от других частей программы.
Файл как область видимости
C# 11 добавил еще один модификатор видимости — file , который с применяется к классам, структурам, делегатам, перечислениям, интерфейсам. Типы с этим модификаторо могут использоваться только внутри текущего файла кода.
Данный модификатор не может использоваться в паре с другими модификаторами.
Введение в ООП с примерами на C#. Часть пятая. Всё о модификаторах доступа
В прошлых статьях серии «Введение в ООП» мы рассматривали полиморфизм (а также нюансы использования его на практике), наследование и абстрактные классы. В этой части я постараюсь раскрыть все тонкости использования модификаторов доступа, которые знаю сам. Продолжаем погружаться в ООП!
Что такое модификаторы доступа?
Давайте в этот раз возьмём определение из Википедии (в русской Википедии статьи access modifiers нет, поэтому здесь приводим свой перевод — прим. перев.) :
Модификаторы доступа (или спецификаторы доступа) — ключевые слова в объектно-ориентированных языках, которые задают (внезапно!) параметры доступа для классов, методов и прочих элементов. Модификаторы доступа — специфичная часть языков программирования для облегчения инкапсуляции компонентов.
Модификаторы public, private, protected
Каждый раз, когда мы создаём класс, мы хотим иметь возможность определять, кто и откуда может взаимодействовать с его членами. Иными словами, нам иногда нужно ограничивать доступ к некоторым членам класса. Есть одно простое правило — члены одного класса всегда имеют доступ друг к другу. Если же говорить про доступ извне, то стоит запомнить, что модификатор доступа по умолчанию — private , т.е. все члены класса доступны только изнутри него самого.
Традиционно сразу переходим к практике. Давайте попробуем выполнить следующий код:
Результатом выполнения этого кода будет:
BBB() отмечен как public , соответственно его можно вызывать откуда угодно. Метод AAA() же никак не отмечен, значит, он является приватным. Однако для члена того же класса (ведь AAA() и BBB() принадлежат одному классу, верно?) это не имеет никакого значения.
Теперь попробуем получить доступ к AAA() напрямую:
‘AccessModifiers.Modifiers.AAA()’ is inaccessible due to its protection level
Для внешних вызовов модификатор private — непреодолимая преграда. То же самое можно сказать и о модификаторе protected .
Модификаторы доступа и наследование
Снова попробуем выполнить код:
Запускаем код и видим…
‘AccessModifiers.ModifiersBase.AAA()’ is inaccessible due to its protection level
Приватные члены недоступны даже дочерним классам. Публичные члены доступны всем, это понятно. Модификатор же protected по сути и обозначает, что член доступен только дочерним классам — вызов CCC() в примере выше не вызывает никаких ошибок.
Модификатор Internal для классов
Давайте рассмотрим следующий сценарий: мы создаём в новой библиотеке классов (назовём её AccessModifiersLibrary ) класс ClassA и помечаем его как internal :
Теперь в созданном ранее файле попробуем выполнить:
Compile time error: ‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
Мы встретили эту ошибку из-за спецификатора доступа internal , который обозначает, что ClassA доступен только внутри AccessModifiersLibrary и ниоткуда больше. Впрочем, если мы уберём этот модификатор, ничего не изменится — internal является спецификатором по умолчанию.
Модификаторы для пространств имён
Давайте попробуем сделать с предыдущим кодом следующее:
Конечно, это не скомпилируется:
Compile time error: A namespace declaration cannot have modifiers or attributes
Все пространства имён по умолчанию являются публичными, и мы не можем добавить к их объявлению никаких модификаторов, включая ещё один public .
Приватные классы
Если мы попробуем скомпилировать код, приведённый выше, то получим ошибку:
Compile time error: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal
Всё правильно: классы могут быть либо public , либо internal .
Подробнее о модификаторах членов класса
Что будет, если мы захотим назначить члену класса больше одного модификатора доступа?
Будет ошибка компиляции:
Compile time error: More than one protection modifier
А как поведёт себя язык, если мы создадим public метод в internal классе?
Вывод после компиляции:
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
The type ‘AccessModifiersLibrary.ClassA’ has no constructors defined
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and
no extension method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’
could be found (are you missing a using directive or an assembly reference?)
Как много ошибок… Дело в том, что какими бы модификаторами не обладали члены internal класса, их всё равно нельзя вызвать оттуда, где не виден сам класс. А что будет, если мы попробуем сделать наоборот — вызвать private или internal метод у public класса?
‘AccessModifiersLibrary.ClassA’ does not contain a definition
for ‘MethodClassA’ and no extension method ‘MethodClassA’ accepting a first argument
of type ‘AccessModifiersLibrary.ClassA’ could be found (are you missing a using directive or an assembly reference?)
Не-а, всё равно не работает. А если изменим модификатор метода на internal ?
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and no extension
method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’ could be
found (are you missing a using directive or an assembly reference?)
Увы, так делать тоже нельзя.
Модификатор protected internal
Этот код компилируется без ошибок. Модификатор internal proteted (как не слишком сложно догадаться) даёт понять, что метод доступен как для вызовов из того же файла, в котором он объявлен, так и для вызовов из дочерних классов.
Protected поля
Здесь всё будет немного сложнее. Давайте напишем следующий код:
Если мы его запустим, то получим ошибку:
Cannot access protected member ‘AccessModifiers.AAA.a’ via a qualifier of type ‘AccessModifiers.AAA’;
the qualifier must be of type ‘AccessModifiers.BBB’ (or derived from it)
Совершенно неочевидно, правда? Компилятор ругается на строчку aaa.a = 100 из метода MethodBBB . Почему никаких ошибок не вызывает метод MethodAAA понять достаточно просто — поле a объявлено в том же файле, в том же классе, в котором к нему и происходит обращение, это не может быть ошибкой. Почему в классе BBB доступен член bbb.a тоже понятно — модификатор protected прямо разрешает использовать члены родительского класса в дочернем как свои. Почему же вызов aaa.a = 100 из метода MethodBBB под запретом? Пожалуй, это стоит просто запомнить.
(От редакции) Скорее всего, это сделано, чтобы нельзя было делать следующим образом:
Приоритет модификаторов
Compile time error: Inconsistent accessibility: base class ‘AccessModifiers.AAA’ is less accessible than class ‘AccessModifiers.BBB’
К дочернему классу не может быть большего доступа, чем к родительскому. Как вы понимаете, public предоставляет гораздо больший доступ, чем модификатор по умолчанию internal . Причём нельзя делать даже так:
Inconsistent accessibility: return type ‘AccessModifiers.AAA’ is less accessible than method ‘AccessModifiers.BBB.MethodB()’
Inconsistent accessibility: field type ‘AccessModifiers.AAA’ is less accessible than field ‘AccessModifiers.BBB.aaa’
Подведём итоги:
- Модификатор доступа по умолчанию для членов класса — private ;
- Модификатор доступа internal значит, что доступ разрешён только из того же файла;
- У пространств имён нет и не может быть модификаторов доступа (можно считать, что они все public );
- Классы могут иметь только два модификатора доступа — internal (по умолчанию) и public
- Модификатор protected internal значит, что доступ есть как из того же файла, так и из дочерних классов
- Родительский класс не может быть менее доступен, чем дочерний
- Возвращаемое значение метода не может быть менее доступно, чем сам метод
- Поле не может быть более доступно, чем его тип
Работу с константами и sealed классами (которая тоже осуществляется за счёт модификаторов доступа) мы разберём в следующей статье.
Инкапсуляция и модификаторы доступа

Объектно-ориентированное программирование – основа создания большинства современных приложений. Оно поддерживает полиморфизм, наследование и абстрактные классы. А еще – инкапсуляцию.
В данной статье речь зайдет именно о ней. Также предстоит разобраться с так называемыми модификаторами доступа. Все это поможет новичкам быстрее освоить концепции объектно-ориентированного программирования. В качестве примеров используются C# и Java. Связано это с широким распространением соответствующих ЯП.
Инкапсуляция – это…
Инкапсуляция – заключение данных и функций в оболочки. В ООП в качестве последнего компонента выступают классы. Они собирают переменные и методы в одном месте, после чего защищают их от вмешательства извне. В процессе реализации «средства защиты» происходит сокрытие информации.
Методы позволяют контролировать обращение к данным, а также предотвратить их удаление или некорректное изменение. Пример – запретить присваивать полю «возраст» объекта «Клиент» число большее 120.
Основные модификаторы
Методы доступа к полям изменяются в зависимости от выбранного языка программирования. Основными вариантами для классов объектов программного кода выступают:
- public;
- protected;
- private;
- internal.
У каждого ЯП свои «дополнительные» модификаторы. Так называют специфичную часть языков программирования для облегчения инкапсуляции. Ключевые слова в ООП, которые задают параметры доступа для классов, методов и иных объектов кода.
Private
Это закрытый или «приватный» элемент класса или структуры. Он будет доступен только в пределах собственного класса. Для того чтобы объявить такой модификатор, нужно использовать ключевое слово private.
При его применении относящиеся к «приватному» типу доступа поля нельзя изменять нигде, кроме как в methods того или иного класса. Значение извне получить тоже не представляется возможным. При попытках это сделать система выведет на экран ошибку. Для устранения неполадки можно использовать:
- ключевое слово readonly, но оно запрещает корректировать значение;
- передачу значения «приватного» члена класса через публичный.
В C# применяется третья концепция – это свойства.
Также есть private protected. Компонент класса будет доступен из любого места в своем классе или в производных классах, определенных в той же сборке. Private protected используется в C#. В случае с Java применяется только ключевое слово «протектед».
Internal
Модификатор доступа internal делает элементы класса доступными из любого места в той же сборке, но он будет недоступен для других приложений и сборок. Если говорить простым языком, то компонент можно получить только в пределах одного файла.
Здесь класс Backpack используется только в пределах файла Program.cs. Если попытаться объявить его внутри другого файла, возникнет ошибка.
Public
Public и protected являются схожими. Второй модификатор доступа отвечает за элементы, доступные из любого места в пределах конкретного класса и его производных. Последние могут располагаться в других сборках.
Public – это самый простой модификатор. С ним сталкиваются все программисты. Называется «публичным» или «общедоступным». Разница с «протектед» очевидна – компонент будет доступен по всему коду. А еще – из других программ и сборок.
Для работы с таким вариантом используется ключевое слово public. Вот – пример приложения с class Item:
Если объявить экземпляр class, можно обратиться к любым его полям в любом месте приложения. Главное, чтобы сам объект был доступен.
Static
Изучая модификаторы private, public и другие в заданном языке программирования, нужно обратить внимание на ключевое слово static.
Статичность – понятие, которое не совсем относится к уровням доступа. Оно помогает заключать реализацию функционала в оболочку класса. Статичность позволяет обращаться к методом или полям без создания объекта.
- Можно не использовать public and protected.
- Метод Sum() применяется в Program, несмотря на то, что экземпляр Calc не создавался.
- Статичным можно сделать отдельный параметр или метод, а также весь class. Для этого все соответствующие элементы должны стать static.
Вместо private and protected используется static, когда требуется создать набор инструментов для его дальнейшего применения в других частях приложения.
Сравнительные таблицы
Каждая программа будет работать в зависимости от способа настройки модификаторов доступа. Эта таблица поможет лучше понять, чем отличается private от public и других спецификаторов:
| Название модификатора | Границы видимости | Краткая характеристика |
| Public | Доступ всем и с любого места | Доступ к полям будут иметь все |
| Private | Доступ «мне и только мне» | Элементы доступны только class, в котором они объявлены |
| Package | «Мне, а также всем в пределах пакета» | Доступ будет иметь не только class, в котором объявлены поля и методы, но и все классы, относящиеся к тому же пакету |
| Protected | «Мне и всем наследникам» | Доступом обладает класс, в котором объявлены поля, а также все classes в пакете и потомки |
Public and protected легко спутать, особенно новичкам.
Выше – таблица, которая поможет лучше разобраться с особенностями спецификаций C#. Они могут применяться как к компонентам class, так и к компонентам структуры. Во втором случае нельзя использовать private and protected, а также protected и protected internal. Связано это с тем, что структуры не поддерживают наследование. Здесь расположен видео-урок по изученной теме на примере Java.
Как освоить тему
Любой язык программирования предусматривает свои особенности и спецификации доступа. Чтобы лучше изучить private, public, static, new string и другие записи выбранного ЯП, рекомендуется закончить специализированные дистанционные компьютерные курсы. Пример – от OTUS. В данном образовательном центре можно быстро освоить инновационные IT-профессии, а также современные языки разработки с нуля.
В процессе обучения пользователям будет предоставлено полноценное кураторство, оказана помощь в формировании собственного портфолио. Ученики в срок до года научатся создавать различные приложения на выбранном ЯП, а также работать со спецификациями. Приобретенные знания подтверждаются специальным электронным сертификатом.
void vs private void в C #
Какая разница между этими простыми void и private void ?
2 ответа
Нет, он синтаксический. По умолчанию члены private , а типы internal ).
Часто люди добавляют private для согласованности, особенно когда это в классе или типе, который имеет много других членов с разными атрибутами доступа, такими как protected internal или public .
Итак, следующие два файла эквивалентны:
Implicit.cs
Explicit.cs
- Типы ( class , struct , enum , delegate , interface ), определенные непосредственно в namespace , являются internal по умолчанию.
- Члены (методы, конструкторы, свойства, вложенные типы, события) по умолчанию private с двумя исключениями:
- Оператор-перегрузки должны быть явно отмечены public static . Вы получите ошибку компиляции, если вы не указали явный модификатор доступа public .
- Элементы интерфейса всегда public , и вы не можете предоставить явный модификатор доступа.
void означает идентифицировать этот блок кода или процедуры как метод или он не вернет никаких значений. Если вы видите какие-либо типы, а не void означает, что заблокированный код или процедура является функцией или свойством
private означает, что метод, функция или свойство недоступны вне класса, но могут быть вызваны внутри самого класса
public означает, что метод, функция или свойство доступны вне класса и могут также вызываться внутри самого класса