Internal vs. Private Access Modifiers
What is the difference between the internal and private access modifiers in C#?
7 Answers 7
internal is for assembly scope (i.e. only accessible from code in the same .exe or .dll)
private is for class scope (i.e. accessible only from code in the same class).
Private: — Private members are only accessible within the own type (Own class).
Internal: — Internal member are accessible only within the assembly by inheritance (its derived type) or by instance of class.
Reference :
dotnetbull — what is access modifier in c#
internal members are visible to all code in the assembly they are declared in.
(And to other assemblies referenced using the [InternalsVisibleTo] attribute)
private members are visible only to the declaring class. (including nested classes)
An outer (non-nested) class cannot be declared private , as there is no containing scope to make it private to.
To answer the question you forgot to ask, protected members are like private members, but are also visible in all classes that inherit the declaring type. (But only on an expression of at least the type of the current class)
Understanding Access Modifiers and Properties with C#
Welcome to the wonderful world of access modifiers and properties, my fellow programmers! Access modifiers and properties are two important concepts in C# that allow you to control the visibility and accessibility of your classes, methods, and variables. It’s like a bouncer for your code, keeping unwanted guests out.
Access Modifiers
In C#, we have several access modifiers that we can use to control the visibility and accessibility of our classes, methods, and variables. The four most common access modifiers are public , private , protected , and internal .
Public members can be accessed from anywhere, both inside and outside the class.
Private members can only be accessed within the class.
Protected members can only be accessed within the class and by classes that inherit from it.
Internal members can only be accessed within the same assembly.
Properties
Are a way to encapsulate a private field and provide a public interface to access and modify its value. In C#, properties are defined using the get and set accessors. The get an accessor is used to retrieve the value of the property, while the set an accessor is used to set the value of the property.
In the example above, we have a private field called _myField and a public property called MyProperty . We use the get accessor to retrieve the value of _myField and the set accessor to set the value of _myField . This allows us to control the accessibility of _myField and provide a public interface for other classes to access and modify its value.
One of the benefits of using properties is that it allows you to add validation logic in the set accessor to ensure that the value being set is valid.
We have added validation logic in the set accessor to ensure that the set value is between 0 and 120.
Lastly
Access modifiers and properties are two important concepts in C# that allow you to control the visibility and accessibility of your classes, methods, and variables. They also provide a way to encapsulate a private field and add validation logic in the set accessor, which is a best practice for ensuring the value being set is valid. So, the next time you're working on your code, don't be afraid to use access modifiers and properties to control the accessibility of your code and make it more organized and well-structured.
В чем состоит работа модификатора private internal
Все поля, методы и остальные компоненты класса имеют модификаторы доступа . Модификаторы доступа позволяют задать допустимую область видимости для компонентов класса. То есть модификаторы доступа определяют контекст, в котором можно употреблять данную переменную или метод.
В языке 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 , который применяется к классам, структурам, делегатам, перечислениям, интерфейсам. Типы с этим модификатором могут использоваться только внутри текущего файла кода.
Данный модификатор не может использоваться в паре с другими модификаторами.
Kotlin. Модификаторы доступа — private, protected, internal, public
Любой класс, а также его конструкторы, свойства и функции имеют модификаторы доступа — это такие ключевые слова, с помощью которых можно задать область действия данных. Или иначе — они позволяют регулировать уровень доступа к различным частям кода.
В Kotlin есть четыре модификатора доступа:
- private
- protected
- internal
- public
Если модификатор явно не указан, то присваивается значение по умолчанию — public.
Модификатор private
Private — самый строгий модификатор доступа. При его использовании данные будут доступны только в пределах конкретного класса или файла.
По сути главное предназначение данного модификатора — реализация инкапсуляции в программе.
Модификатор protected
Данные, отмеченные модификатором protected будут видны:
- внутри класса, в котором они объявлены.
- в дочерних классах.
При этом нельзя отметить модификатором protected данные высокого уровня. К таким данным относятся классы, а также переменные или функции, объявленные вне класса.
Если в дочернем классе мы переопределим метод с модификатором protected, то он унаследует модификатор доступа от родителя и будет виден только внутри дочернего класса. Несмотря на то, что модификатор не будет указан явно.
Помимо модификатора protected такому методу можно задать модификатор public. При использовании остальных модификаторов Kotlin ругается.
Модификатор internal
Как правило при разработке проекта мы делим его на независимые модули. Каждый модуль состоит из файлов, компилируемых вместе. Так вот модификатор internal позволяет сделать данные видимыми для всего модуля.
Данный модификатор можно применять ко всем типам данных. Однако он полезен только в том случае, если в проекте есть более одного модуля. Иначе используется модификатор public.
Например, в проекте есть два модуля — Module1 и Module2. В первом модуле есть класс Person() .
И еще в первом модуле есть такой файл:
Так как этот файл тоже находится в Module1, то мы можем получить доступ к переменным a и b . Но если попытаться к ним обратиться из Module2 — получим ошибку.
Модификатор public
Если при объявлении каких-либо данных использовать модификатор public, то они будут видны всем (даже в космосе). Еще public является модификатором по умолчанию для тех данных, которым модификатор явно не был указан.
Полезные ссылки
Официальная документация — Visibility Modifiers.
Документация в переводе на русский — Модификаторы доступа.