Перейти к содержимому

Internal c что это

  • автор:

internal (Справочник по C#)

Ключевое слово internal является модификатором доступа для типов и членов типов.

Эта страница содержит доступ internal . Ключевое слово internal также является частью модификатора доступа protected internal .

Внутренние типы или члены доступны только внутри файлов в той же сборке, как в следующем примере:

public class BaseClass < // Only accessible within the same assembly. internal static int x = 0; >

Сравнение модификатора internal с другими модификаторами доступа см. в разделах Уровни доступности и Модификаторы доступа.

См. дополнительные сведения о сборках в .NET.

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

Будет ошибкой ссылаться на тип или член с внутренним доступом из-за пределов сборки, в которой он определен.

Пример 1

Этот пример содержит два файла, Assembly1.cs и Assembly1_a.cs . Первый файл содержит внутренний базовый класс BaseClass . Во втором файле попытка создать экземпляр BaseClass приведет к ошибке.

// Assembly1.cs // Compile with: /target:library internal class BaseClass
// Assembly1_a.cs // Compile with: /reference:Assembly1.dll class TestAccess < static void Main() < var myBase = new BaseClass(); // CS0122 >> 

Пример 2

В этом примере используйте те же файлы, которые использовались в примере 1, однако измените уровень доступности BaseClass на public . Кроме того, измените уровень доступности члена intM на internal . В этом случае можно создать экземпляр класса, но нельзя получить доступ к внутреннему члену.

// Assembly2.cs // Compile with: /target:library public class BaseClass
// Assembly2_a.cs // Compile with: /reference:Assembly2.dll public class TestAccess < static void Main() < var myBase = new BaseClass(); // Ok. BaseClass.intM = 444; // CS0117 >> 

Спецификация языка C#

Дополнительные сведения см. в разделе Объявленная доступность в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

  • Справочник по C#
  • Руководство по программированию на C#
  • Ключевые слова в C#
  • Модификаторы доступа
  • Уровни доступности
  • Модификаторы
  • public
  • private
  • protected

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Модификатор доступа internal

Сборка является неотъемлемой частью программирования на C#. Она представляет собой один или несколько файлов, содержащих все необходимые сведения о развертывании программы и ее версии. Сборки составляют основу среды .NET. Они предоставляют механизмы для надежного взаимодействия компонентов, межъязыковой возможности взаимодействия и управления версиями. Кроме того, сборки определяют область действия программного кода.

Сборка состоит из четырех разделов. Первый раздел представляет собой манифест сборки. Манифест содержит сведения о самой сборке. К этой информации относится, в частности, имя сборки, номер ее версии, сведения о соответствии типов и параметры культурной среды (язык и региональные стандарты). Второй раздел сборки содержит метаданные типов, т.е. сведения о типах данных, используемых в программе. Среди прочих преимуществ метаданные типов способствуют межъязыковой возможности взаимодействия. Третий раздел сборки содержит программный код в формате MSIL (Microsoft Intermediate Language — промежуточный язык корпорации Microsoft). И четвертый раздел сборки содержит ресурсы, используемые программой.

Правда, при программировании на C# сборки получаются автоматически, требуя от программирующего лишь минимальных усилий. Дело в том, что исполняемый файл, создаваемый во время компиляции программы на C#, на самом деле представляет собой сборку, содержащую исполняемый код этой программы, а также другие виды информации. Таким образом, когда компилируется программа на C#, сборка получается автоматически.

Сборки являются неотъемлемой частью процесса разработки программного обеспечения в среде .NET, но формально они не относятся к средствам языка C#. Тем не менее в C# имеется одно средство, непосредственно связанное со сборкой.

Помимо модификаторов доступа public, private и protected, в C# предусмотрен также модификатор доступа internal. Этот модификатор определяет доступность члена во всех файлах сборки и его недоступность за пределами сборки. Проще говоря, о члене, обозначенном как internal, известно только в самой программе, но не за ее пределами. Модификатор доступа internal особенно полезен для создания программных компонентов.

Модификатор доступа internal можно применять к классам и их членам, а также к структурам и членам структур. Кроме того, модификатор internal разрешается использовать в объявлениях интерфейсов и перечислений.

Из модификаторов protected и internal можно составить спаренный модификатор доступа protected internal. Уровень доступа protected internal может быть задан только для членов класса. Член, объявленный как protected internal, доступен лишь в пределах собственной сборки или для производных типов.

Internal c что это

Все поля, методы и остальные компоненты класса имеют модификаторы доступа . Модификаторы доступа позволяют задать допустимую область видимости для компонентов класса. То есть модификаторы доступа определяют контекст, в котором можно употреблять данную переменную или метод.

В языке C# применяются следующие модификаторы доступа:

Модификаторы доступа public, protected, internal, private в языке программирования C# и в .NET

  • private : закрытый или приватный компонент класса или структуры. Приватный компонент доступен только в рамках своего класса или структуры.
  • private protected : компонент класса доступен из любого места в своем классе или в производных классах, которые определены в той же сборке.
  • file : добавлен в версии C# 11 и применяется к типам, например, классам и структурам. Класс или структура с такми модификатором доступны только из текущего файла кода.
  • protected : такой компонент класса доступен из любого места в своем классе или в производных классах. При этом производные классы могут располагаться в других сборках.
  • internal : компоненты класса или структуры доступен из любого места кода в той же сборке, однако он недоступен для других программ и сборок.
  • protected internal : совмещает функционал двух модификаторов protected и internal . Такой компонент класса доступен из любого места в текущей сборке и из производных классов, которые могут располагаться в других сборках.
  • public : публичный, общедоступный компонент класса или структуры. Такой компонент доступен из любого места в коде, а также из других программ и сборок.

Стоит отметить, что эти модификаторы могут применяться как к компонентам класса, так и к компонентам структуры за тем исключением, что структуры не могут использовать модификаторы private protected , protected и protected internal , поскольку структуры не могут быть унаследованы.

Все классы и структуры, определенные напрямую вне других типов (классов и структур) могут иметь только модификаторы public , file или internal .

Мы можем явно задать модификатор доступа, а можем его и не указывать:

public class Person < string name; public Person(string name) < this.name = name; >public void Print() => Console.WriteLine($"Name: "); >

Если для компонентов не определен модификатор доступа, то по умолчанию для них применяется модификатор private . Например, в примере выше переменная name неявно будет иметь модификатор private .

Классы и структуры, которые объявлены без модификатора и которые расположены вне других типов, по умолчанию имеют доступ internal , а вложенные классы и структуры, как и остальные компоненты классов/структур имеют модификатор private . Например:

class Phone < struct Camera < >>

Здесь класс Phone не является вложенным ни в один другой класс/структуру, поэтому неявно имеет модификатор internal . А структура Camera является вложенной, поэтому, как и другие компоненты класса, неявно имеет модификатор private

Модификаторы в рамках текущего проекта

Посмотрим на примере и создадим следующий класс State:

class State < // все равно, что private string defaultVar; string defaultVar ="default"; // поле доступно только из текущего класса private string privateVar = "private"; // доступно из текущего класса и производных классов, которые определены в этом же проекте protected private string protectedPrivateVar = "protected private"; // доступно из текущего класса и производных классов protected string protectedVar = "protected"; // доступно в любом месте текущего проекта internal string internalVar = "internal"; // доступно в любом месте текущего проекта и из классов-наследников в других проектах protected internal string protectedInternalVar = "protected internal"; // доступно в любом месте программы, а также для других программ и сборок public string publicVar = "public"; // по умолчанию имеет модификатор private void Print() =>Console.WriteLine(defaultVar); // метод доступен только из текущего класса private void PrintPrivate() => Console.WriteLine(privateVar); // доступен из текущего класса и производных классов, которые определены в этом же проекте protected private void PrintProtectedPrivate() => Console.WriteLine(protectedPrivateVar); // доступен из текущего класса и производных классов protected void PrintProtected() => Console.WriteLine(protectedVar); // доступен в любом месте текущего проекта internal void PrintInternal() => Console.WriteLine(internalVar); // доступен в любом месте текущего проекта и из классов-наследников в других проектах protected internal void PrintProtectedInternal() => Console.WriteLine(protectedInternalVar); // доступен в любом месте программы, а также для других программ и сборок public void PrintPublic() => Console.WriteLine(publicVar); >

Так как класс State не имеет явного модификатора, по умолчанию он имеет модификатор internal , поэтому он будет доступен из любого места данного проекта, однако не будет доступен из других программ и сборок.

Класс State имеет шесть полей для каждого уровня доступа. Плюс одна переменная без модификатора, которая является закрытой (private) по умолчанию. А также определено семь методов с разными модификаторами, которые выводят значения соответствующих переменных на консоль. Поскольку все модификаторы позволяют использовать компоненты класса внутри данного класса, то и все переменные класса, в том числе закрытые, у нас доступны всем его методам, так как все находятся в контексте класса State.

Теперь посмотрим, как мы сможем использовать переменные класса State в другом классе, который, допустим, будет называться StateConsumer и который расположен в том же проекте :

class StateConsumer < public void PrintState() < State state = new State(); // обратиться к переменной defaultVar у нас не получится, // так как она имеет модификатор private и класс StateConsumer ее не видит Console.WriteLine(state.defaultVar); //Ошибка, получить доступ нельзя // то же самое относится и к переменной privateVar Console.WriteLine(state.privateVar); // Ошибка, получить доступ нельзя // обратиться к переменной protectedPrivateVar не получится, // так как класс StateConsumer не является классом-наследником класса State Console.WriteLine(state.protectedPrivateVar); // Ошибка, получить доступ нельзя // обратиться к переменной protectedVar тоже не получится, // так как класс StateConsumer не является классом-наследником класса State Console.WriteLine(state.protectedVar); // Ошибка, получить доступ нельзя // переменная internalVar с модификатором internal доступна из любого места текущего проекта // поэтому можно получить или изменить ее значение Console.WriteLine(state.internalVar); // переменная protectedInternalVar так же доступна из любого места текущего проекта Console.WriteLine(state.protectedInternalVar); // переменная publicVar общедоступна Console.WriteLine(state.publicVar); >>

Таким образом, в классе StateConsumer мы смогли только обратиться к переменным internalVar, protectedInternalVar и publicVar, так как их модификаторы позволяют использовать в данном контексте.

Аналогично дело обстоит и с методами:

class StateConsumer < public void PrintState() < State state = new State(); state.Print(); //Ошибка, получить доступ нельзя state.PrintPrivate(); // Ошибка, получить доступ нельзя state.PrintProtectedPrivate(); // Ошибка, получить доступ нельзя state.PrintProtected(); // Ошибка, получить доступ нельзя state.PrintInternal(); // норм state.PrintProtectedInternal(); // норм state.PrintPublic(); // норм >>

Здесь нам оказались доступны только три метода: PrintInternal, PrintProtectedInternal, PrintPublic, которые имееют соответственно модификаторы internal, protected internal, public.

Модификаторы в рамках сборок

Допустим, у нас есть проект (и соответственно сборка) MyLib, в которой определены три класса:

namespace MyLib; // класс доступен из других сборок public class PublicState < internal void PrintInternal() =>Console.WriteLine(«internal»); protected internal void PrintProtectedInternal() => Console.WriteLine(«protected internal»); public void PrintPublic() => Console.WriteLine(«public»); > // класс доступен только в текущей сборке — по умолчанию internal class DefaultState < >// класс доступен только в текущей сборке internal class InternalState

Здесь классы DefaultState и InternalState имеют модификатор internal , поэтому доступны только в текущем проекте.

Класс PublicState модификатором public доступен из других проектов. Однако его метод PrintInternal() доступен только в текущем проекте. Вне текущего проекта доступен только его метод PrintPublic и PrintProtectedInternal() (доступен в другом проекте только в классах-наследниках).

Допустим, мы подключаем сборку этого проекта MyLib в другой проект, где есть класс StateConsumer:

using MyLib; class StateConsumer < public void PrintState() < // Ошибка DefaultState - по умолчанию internal, поэтому нет доступа DefaultState defaultState = new DefaultState(); // Ошибка InternalState - internal, поэтому нет доступа InternalState internalState = new InternalState(); // норм, PublicState - public, доступен из других программ PublicState publicState = new PublicState(); // Ошибка, нет доступа - метод доступен только в свой сборке publicState.PrintInternal(); // Ошибка, нет доступа - StateConsumer НЕ является классом-наследником от класса PublicState, // поэтому метод не доступен publicState.PrintProtectedInternal(); // нет доступа // норм - общедоступный метод publicState.PrintPublic(); // норм >>

Модификаторы доступа в языке программирования C# и в .NET

В классе StateConsumer есть доступ только к классу PublicState и его методу PrintPublic , потому что они имеют модификатор public . К остальной функциональности подключенной сборки StateConsumer доступа не имеет.

Благодаря такой системе модификаторов доступа можно скрывать некоторые моменты реализации класса от других частей программы.

Файл как область видимости

C# 11 был добавлен еще один модификатор видимости — file , который применяется к классам, структурам, делегатам, перечислениям, интерфейсам. Типы с этим модификатором могут использоваться только внутри текущего файла кода.

file class Person

Данный модификатор не может использоваться в паре с другими модификаторами.

Модификаторы доступа (Руководство по программированию в C#)

Все типы и члены типов имеют уровень доступности. Он определяет возможность их использования из другого кода в вашей или в других сборках. Сборка — это DLL или EXE-файл, созданный путем компиляции одного или нескольких CS-файлов в одной компиляции. Следующие модификаторы доступа позволяют указать доступность типа или члена при объявлении:

  • public: тип или член можно получить к любому другому коду в той же сборке или другой сборке, которая ссылается на нее. Уровень доступности общедоступных элементов типа определяется уровнем доступности самого типа.
  • private: тип или член можно получить только по коду в том же class или struct .
  • защищенный: к типу или члену можно обращаться только по коду в том же class коде или в class производном от него class .
  • internal: тип или член можно получить к любому коду в одной сборке, но не из другой сборки. Другими словами, internal доступ к типам или элементам можно получить из кода, который является частью той же компиляции.
  • защищенный внутренний: к типу или члену можно получить доступ к любому коду в сборке, в которой она объявлена, или из производной class в другой сборке.
  • private protected: доступ к типу или элементу возможен из типов, производных от объекта class и объявляемых в сборке, содержащей этот объект.

Сводная таблица

Расположение вызывающего объекта public protected internal protected internal private protected private
В классе ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Производный класс (та же сборка) ✔️ ✔️ ✔️ ✔️ ✔️
Непроизводный класс (та же сборка) ✔️ ✔️ ✔️
Производный класс (другая сборка) ✔️ ✔️ ✔️
Непроизводный класс (другая сборка) ✔️

В следующих примерах показано, как изменить модификаторы доступа для типа или члена типа:

public class Bicycle < public void Pedal() < >> 

Не все модификаторы доступа подходят для всех типов или членов во всех контекстах. В некоторых случаях доступность члена типа ограничивается доступностью содержащего его типа.

Доступность классов, записей и структур

Классы, записи и структуры, объявленные непосредственно в пространстве имен (другими словами, не вложенные в другие классы или структуры), могут быть public или internal . Если модификатор доступа не указан, по умолчанию используется internal .

Члены структуры, включая вложенные классы и структуры, могут быть объявлены как public , internal или private . Члены класса, включая вложенные классы и структуры, могут быть public , protected internal , protected , internal , private protected или private . Члены класса и структуры, включая вложенные классы и структуры, по умолчанию имеют доступ private . Закрытые вложенные типы недоступны за пределами типа, в котором содержатся.

Производные классы записи не могут быть более доступными, чем соответствующие базовые типы. Невозможно объявить открытый класс B , производный от внутреннего класса A . Если бы это было возможно, класс A стал бы открытым, так как все члены protected или internal класса A были бы доступны из производного класса.

Доступ к внутренним типам можно предоставить некоторым другим сборкам с помощью InternalsVisibleToAttribute . Дополнительные сведения см. в разделе Дружественные сборки.

Доступность членов классов, записей и структур

Члены классов и записей (включая вложенные классы, записи и структуры) можно объявлять с любым из шести типов доступа. Члены структуры не могут быть объявлены как protected , protected internal или private protected , так как структуры не поддерживают наследование.

Как правило, уровень доступности члена не может быть выше уровня доступности типа, в который он входит. При этом член public внутреннего класса может быть доступен за пределами сборки, если он реализует методы интерфейса или переопределяет виртуальные методы, определенные в открытом базовом классе.

Тип любого поля, свойства или события члена должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Точно так же тип возвращаемого значения и типы параметров любого метода, индексатора или делегата должен иметь по меньшей мере такой же уровень доступности, как у самого члена. Например, невозможно иметь метод public M , возвращающий класс C , если только C также не является public . Аналогичным образом, невозможно иметь свойство protected типа A , если A объявлен как private .

Пользовательские операторы всегда должны объявляться как public и static . Для получения дополнительной информации см. раздел Перегрузка операторов.

Методы завершения не могут иметь модификаторы доступа.

Чтобы настроить уровень доступа для члена class , record или struct , добавьте в объявление этого члена соответствующее ключевое слово, как показано в следующем примере.

// public class: public class Tricycle < // protected method: protected void Pedal() < >// private field: private int _wheels = 3; // protected internal property: protected internal int Wheels < get < return _wheels; >> > 

Другие типы

Интерфейсы, объявляемые непосредственно в пространстве имен, могут быть public или internal . Как и в случае с классами и структурами, для интерфейсов по умолчанию задается доступ internal . Члены интерфейса по умолчанию являются public , так как интерфейс как раз и создан для того, чтобы обеспечить другим типам доступ к классу или структуре. Объявления членов интерфейса могут включать любой модификатор доступа. Это удобнее всего использовать для статических методов, чтобы предоставить общие реализации, необходимые всем объектам, реализующим класс.

Члены перечисления всегда являются public , и модификаторы доступа к ним не применяются.

Делегаты ведут себя как классы и структуры. По умолчанию они имеют доступ internal , если объявляются непосредственно в пространстве имен, и доступ private , если являются вложенными.

Сводная таблица доступа по умолчанию

Тип Доступ по умолчанию
class internal
struct internal
interface internal
record internal
enum internal
interface Членов public
Анонимные типы internal
члены класса, записи и структуры private

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

  • Укажите порядок модификаторов (правило стиля IDE0036)
  • Руководство по программированию на C#
  • Система типов C#
  • Интерфейсы
  • Уровни доступности
  • private
  • public
  • internal
  • protected
  • protected internal
  • private protected
  • sealed
  • class
  • struct
  • interface
  • Анонимные типы

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *