C # сборки, что в сборке? - PullRequest
       5

C # сборки, что в сборке?

20 голосов
/ 15 декабря 2010

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

namespace Engine.Entity

Переменная, о которой идет речь, определена в классе внутри этого пространства имен, поэтому я предположила, что если я это сделаювнутренние, только объекты внутри этого пространства имен имеют доступ к нему.Я вижу сборки и пространства имен как одно целое, и я не думаю, что это правильно.

Ответы [ 5 ]

21 голосов
/ 15 декабря 2010

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

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

Вы помещаете свой код в определенную сборку, компилируя ваш код в проект (csproj), который создает DLL илиEXE.

Пространство имен может охватывать несколько сборок.То есть классы, которые являются членами этого логического пространства имен, могут находиться в нескольких библиотеках DLL.Вы можете получить доступ к определенному классу в своем исходном коде, только если ваш проект ссылается на правильную сборку (DLL), которая содержит этот класс.

Модификатор Internal означает, что доступ к символу возможен только из той же сборки.Только код, который скомпилирован в ту же DLL, что и ваш код, может получить доступ к вашим свойствам или методам, которые помечены как внутренние.

6 голосов
/ 15 декабря 2010

Люди легко путаются с пространством имен / сборкой, так как оно разделяет концепцию, где физически расположен ваш код (сборка), и как вы ссылаетесь на него (логическая ссылка - это использование пространства имен, а физическая ссылка - ссылка насборка).

Обычно я объясняю это словом contribute:

  1. Сборка может содержать несколько пространств имен .
    ДляНапример, сборка System.Data.dll вносит вклад в пространства имен, такие как System.Data (например, класс System.Data.DataTable) и Microsoft.SqlServer.Server (например, класс Microsoft.SqlServer.Server.SqlContext).

  2. Несколько сборок могут вносить вклад в одно пространство имен .
    Например, сборка System.Data.dll и сборка System.Xml.dll вносят вклад в пространство имен System.Xml.
    Это означает, что если вы используете System.Xml.XmlDataDocumentкласс из вашего проекта, вам нужно ссылаться на сборку System.Data.dll.
    А если вы используете класс System.Xml.XmlDocument, вам нужно ссылаться на System.Xml.dll из вашего проекта.

(вышеуказанный примерmples - это .NET 4.0, но, вероятно, подходит и для предыдущих версий .NET)хорошо, поэтому я не буду вдаваться в подробности о них.

- jeroen

2 голосов
/ 15 декабря 2010

С внутренний (C # ссылка)

Внутреннее ключевое слово является модификатором доступа для типов и членов типов.Внутренние типы или элементы доступны только внутри файлов в одной сборке

Таким образом, это означает, что внутри одной сборки / dll, а не пространство имен .

0 голосов
/ 15 декабря 2010

Пространства имен и сборки не являются синонимами. Часто пространство имен охватывает несколько сборок. Любой управляемый код, созданный из Visual Studio, имеет однозначное соответствие проектов сборкам в двоичных файлах DLL / EXE.

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

«Внутренний» модификатор доступа просто означает, что к цели можно получить доступ только из этой сборки. Он не имеет отношения к пространствам имен.

0 голосов
/ 15 декабря 2010

По сути, вы не можете сделать переменную видимой только из заданного пространства имен. Поскольку любой может определить любое пространство имен, это сделает идею internal void: вам просто нужно написать

namespace System
{
    public static MySystemInternalSpy
    {
        public static void SpyInternals()
        {
            ...
        }
    }
}

для получения доступа к любой переменной, классу или методу, определенному как internal в пространстве имен System, например.

...