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

C# — Сборки .NET — Модификатор доступа 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, доступен лишь в пределах собственной сборки или для производных типов.

Все члены класса — поля, методы, свойства — все они имеют модификаторы доступа . Модификаторы доступа позволяют задать допустимую область видимости для членов класса. То есть модификаторы доступа определяют контекст, в котором можно употреблять данную переменную или метод. В предыдущих темах мы уже с ним сталкивались, когда объявляли поля класса публичными (то есть с модификатором public ).

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

public : публичный, общедоступный класс или член класса. Такой член класса доступен из любого места в коде, а также из других программ и сборок.

private : закрытый класс или член класса. Представляет полную противоположность модификатору public. Такой закрытый класс или член класса доступен только из кода в том же классе или контексте.

protected : такой член класса доступен из любого места в текущем классе или в производных классах. При этом производные классы могут располагаться в других сборках.

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

protected internal : совмещает функционал двух модификаторов. Классы и члены класса с таким модификатором доступны из текущей сборки и из производных классов.

private protected : такой член класса доступен из любого места в текущем классе или в производных классах, которые определены в той же сборке.

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

Либо можем не указывать:

Если для полей и методов не определен модификатор доступа, то по умолчанию для них применяется модификатор private .

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

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

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

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

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

Теперь посмотрим, как мы сможем использовать переменные нашего класса в программе (то есть в методе Main класса Program), если классы State и Program находятся в одном проекте :

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

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

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

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

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

Ключевое слово internal является модификатором доступа для типов и членов типов. The internal keyword is an access modifier for types and type members.

Эта страница содержит доступ internal . This page covers internal access. Ключевое слово internal также является частью модификатора доступа protected internal . The internal keyword is also part of the protected internal access modifier.

Внутренние типы или члены доступны только внутри файлов в той же сборке, как в следующем примере: Internal types or members are accessible only within files in the same assembly, as in this example:

Сравнение модификатора internal с другими модификаторами доступа см. в разделах Уровни доступности и Модификаторы доступа. For a comparison of internal with the other access modifiers, see Accessibility Levels and Access Modifiers.

См. дополнительные сведения о сборках в .NET. For more information about assemblies, see Assemblies in .NET.

Обычно доступ к внутренним компонентам используется в разработке на основе компонентов, так как он позволяет группе компонентов взаимодействовать в закрытой форме, без их предоставления остальной части кода приложения. A common use of internal access is in component-based development because it enables a group of components to cooperate in a private manner without being exposed to the rest of the application code. Например, платформа для создания графических интерфейсов пользователя может предоставлять классы Control и Form , взаимодействующие с помощью членов с внутренним доступом. For example, a framework for building graphical user interfaces could provide Control and Form classes that cooperate by using members with internal access. Поскольку эти члены являются внутренними, они не предоставляются коду, использующему платформу. Since these members are internal, they are not exposed to code that is using the framework.

Будет ошибкой ссылаться на тип или член с внутренним доступом из-за пределов сборки, в которой он определен. It is an error to reference a type or a member with internal access outside the assembly within which it was defined.

Пример Example

Этот пример содержит два файла, Assembly1.cs и Assembly1_a.cs . This example contains two files, Assembly1.cs and Assembly1_a.cs . Первый файл содержит внутренний базовый класс BaseClass . The first file contains an internal base class, BaseClass . Во втором файле попытка создать экземпляр BaseClass приведет к ошибке. In the second file, an attempt to instantiate BaseClass will produce an error.

Пример Example

В этом примере используйте те же файлы, которые использовались в примере 1, однако измените уровень доступности BaseClass на public . In this example, use the same files you used in example 1, and change the accessibility level of BaseClass to public . Кроме того, измените уровень доступности члена intM на internal . Also change the accessibility level of the member intM to internal . В этом случае можно создать экземпляр класса, но нельзя получить доступ к внутреннему члену. In this case, you can instantiate the class, but you cannot access the internal member.

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

Дополнительные сведения см. в разделе Объявленная доступность в Спецификации языка C#. For more information, see Declared accessibility in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#. The language specification is the definitive source for C# syntax and usage.

Оцените статью
SoftLast
Добавить комментарий