С# сборки, что в сборке?
Я пытаюсь понять модификатор внутреннего доступа в С#. Я не могу понять, что такое сборка, и какая часть моей программы хранится внутри этой сборки. Я пытался сделать так, чтобы переменная была доступна только объектам в следующем пространстве имен:
namespace Engine.Entity
Переменная, о которой идет речь, определяется в классе внутри этого пространства имен, поэтому я предположил, что если я сделал ее внутренней, для нее доступны только объекты внутри этого пространства имен. Я вижу собрания и пространства имен как одно, и я не думаю, что это правильно.
Ответы
Ответ 1
Пространства имен влияют только на разрешение имен. Пространства имен не подразумевают какого-либо хранилища, и пространства имен не определяют, какие библиотеки содержат ваш код. Пространства имен позволяют группировать связанные вещи вместе под логическим именем, даже если они могут физически находиться в разных библиотеках DLL.
Сборка в основном представляет собой только DLL или EXE файл. Он содержит IL-код и информацию о типе, которая описывает код в этой DLL или EXE. Он может содержать много других вещей, но для начинающих просто думайте об этом как о DLL.
Вы помещаете свой код в конкретную сборку, компилируя свой код в проект (csproj), который создает DLL или EXE.
Пространство имен может охватывать несколько сборок. То есть классы, входящие в это логическое пространство имен, могут находиться в нескольких библиотеках DLL. Вы можете получить доступ к определенному классу в исходном коде, только если ваш проект ссылается на правильную сборку (DLL), которая содержит этот класс.
Внутренний модификатор означает, что доступ к символу возможен только из одной и той же сборки. Только код, который скомпилирован в ту же DLL, что и ваш код, может получить доступ к вашим свойствам или методам, которые помечены как внутренние.
Ответ 2
Люди легко путаются с помощью пространства имен/сборки, поскольку оно отделяет концепцию того, где ваш код физически находится (сборка) и как вы его ссылаетесь (логическая ссылка с использованием пространства имен и физической ссылки осуществляется путем ссылки на монтаж).
Я обычно объясняю это, используя слово contribute
:
-
Сборка может способствовать созданию нескольких пространств имен.
Например, сборка System.Data.dll
вносит вклад в пространства имен, такие как System.Data
(например, класс System.Data.DataTable
) и Microsoft.SqlServer.Server
(например, класс Microsoft.SqlServer.Server.SqlContext
).
-
Несколько сборок могут вносить вклад в одно пространство имен.
Например, сборка System.Data.dll
и сборка System.Xml.dll
вносят вклад в пространство имен System.Xml
.
Это означает, что если вы используете класс System.Xml.XmlDataDocument
из своего проекта, вам нужно обратиться к сборке System.Data.dll
.
И если вы используете класс System.Xml.XmlDocument
, вам нужно ссылаться на System.Xml.dll
из вашего проекта.
(приведенные выше примеры -.NET 4.0, но, скорее всего, для предыдущих версий .NET).
Дэнни Торп объяснил концепцию namespace
и internal
действительно хорошо, поэтому я выиграл подробно расскажите о них.
- Йерун
Ответ 3
Из внутренний (ссылка С#)
Внутреннее ключевое слово - это доступ модификатор для типов и типов. Внутренние типы или члены доступный только в файлах в та же сборка
Таким образом, это означает изнутри той же сборки /dll, а не namespace.
Ответ 4
В принципе, вы не можете сделать переменную видимой только из заданного пространства имен. Поскольку любой может определить любое пространство имен, это создало бы идею internal
void: вам просто нужно написать
namespace System
{
public static MySystemInternalSpy
{
public static void SpyInternals()
{
...
}
}
}
чтобы получить доступ к любой переменной, классу или методу, определенным как internal
в пространстве имен System
, например.
Ответ 5
Пространства имен и сборки не являются синонимами. Часто пространство имен охватывает несколько сборок. Любой управляемый код, созданный на Visual Studio, имеет один для одного соответствия проектов для сборок в двоичные файлы DLL/EXE.
Однако, если вы связали управляемый код с командной строкой, вы можете создать сборку, в которой все файлы проекта принадлежат одной сборке (что означает, что несколько файлов на вашем диске вместе представляют одну сборку). Но не обращайте внимания на этот случай, это эзотерическая вещь, которая никогда не бывает на практике.
"Внутренний" модификатор доступа просто означает, что цель может быть доступна только из этой сборки. Он не имеет отношения к пространствам имен.