Добавление ссылки на сборку нарушает доступ к защите внутренних классов? [Дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

65
задан gunr2171 3 February 2014 в 17:44
поделиться

8 ответов

System.Data является пространством имен , System.Data.DLL (файл) является сборкой .

Пространство имен является логической группировкой типов (в основном, чтобы избежать столкновений имен). Сборка может содержать типы в нескольких пространствах имен (System.DLL содержит несколько ...), и одно пространство имен может быть распределено по сборкам (например, System.Threading).

91
ответ дан D Stanley 19 August 2018 в 07:41
поделиться
  • 1
    как мы укажем, какое пространство имен должно быть в сборке? – Ehsan Sajjad 23 December 2016 в 14:19
  • 2
    @EhsanSajjad Между ними нет связи direct . Сборка создается из файлов кода (обычно через проект), каждая из которых содержит классы, которые находятся в пространстве имен. Таким образом, вы косвенно решаете, что, выбрав, какие файлы находятся в проекте. Если это не поможет, не стесняйтесь задавать новый вопрос. – D Stanley 23 December 2016 в 16:24
  • 3
    это имеет смысл. Благодаря!! – Ehsan Sajjad 23 December 2016 в 16:35

Короче:

Сборка:

Сборка представляет собой фундаментальный блок группировки физического кода. Это модуль вывода. Это подразделение Deployment & amp; блок управления версиями.

Пространство имен:

Пространство имен представляет собой базовую единицу группировки логических кодов. Это коллекция имен, в которых каждое имя уникально. Они образуют логическую границу для группы классов. В свойствах проекта должны быть указаны пространство имен.

14
ответ дан Anurag Jain 19 August 2018 в 07:41
поделиться

Другие дали очень хорошие и подробные ответы на этот вопрос. Но я хочу отметить, что, когда вы не уверены, вы можете посмотреть на MSDN. Библиотека MSDN очень четко и просто объясняет пространство имен и сборку, в которых находится данный тип. Он даже говорит имя файла (in System.Data.dll), поэтому нет никакой двусмысленности.

enter image description here [/g0]

7
ответ дан bouvierr 19 August 2018 в 07:41
поделиться

Как пишет @amdluigi, «как правило, имя сборки такое же, как пространство имен, которое оно содержит, но не всегда».

В объекте System.Data.dll есть скриншот выше. Браузер в студии. Это отличный пример для изучения проблем здесь. Обратите внимание, что большинство пространств имен, содержащихся в сборке, являются System.Data или подпространством имен System.Data.

Как правило, для имен сборки должно быть связано с пространством имён , Обратите внимание, что когда Studio сначала создает проект для сборки сборки, одним из свойств проекта является пространство имен по умолчанию. Вначале Studio предоставляет пространство имен по умолчанию с тем же именем, что и сам проект. Если вы когда-нибудь захотите переименовать проект, подумайте об изменении своего пространства имен по умолчанию.

Есть два дополнительных пространства имен: Microsoft.SqlServer понятен. Некоторые типы SQL Server, которые они не хотели упаковывать в отдельную сборку.

Но что с System.Xml ???? Существует сборка System.Xml.dll. Почему это пространство имен также отображается в System.Data.dll?

Обратите внимание, что сборка может повторно открыть пространство имен и добавить к нему больше - это именно то, что System.Data.dll делает с системой. Xml namespace.

Причина в том, что пространства имен имеют нулевые значения производительности, но сборки очень много. Если у вас 1000 классов с большим количеством кода, вы не хотите, чтобы одна сборка имела очень большой объем памяти. Также вы не хотите 1000 сборок каждый с одним классом. Любая сборка должна быть загружена в память до того, как ее содержимое будет выполнено. Вы хотите, чтобы сборка содержала разумное количество взаимосвязанных классов, поэтому, как только ваше приложение загрузило сборку для получения одного из своих классов, она получит другие классы, которые, скорее всего, потребуются для приложения. Гранулярность важна: не слишком большая, не слишком маленькая, просто.

Обратите внимание, что System.Data.dll снова открывает System.Xml и добавляет ровно один класс: XmlDataDocument. Случается, что этот класс используется для интерпретации реляционных данных как XML-документа. Если ваше приложение просто использует XML, ему не нужен этот класс. Если ваше приложение имеет дело с реляционными данными, оно может. Таким образом, хотя XmlDataDocument наследуется от XmlDocument и находится в пространстве имен System.Xml, он упакован в сборку System.Data.dll.

Все это особенно важно, если у вас есть фон с Java, где есть только одна концепция, пакет. В .NET есть две, сборка и пространство имен. Эти два ортогональны. Очевидно, что сборка содержит более одного пространства имен. Сборка может снова открыть пространство имен и добавить к нему больше - другими словами, типы в пространстве имен могут охватывать более одной сборки.

5
ответ дан Concrete Gannet 19 August 2018 в 07:41
поделиться

Файл, который вы видите в GAC, является System.Data.dll, который является сборкой и содержит пространства имен, включая System.Data. Если вы просмотрите свойства Reference в Visual Studio, вы увидите:

enter image description here [/g0]

Позже, если вы щелкните правой кнопкой мыши по ссылке и выберите вид в браузере объектов, вы будут видеть пространства имен в этой конкретной сборке.

enter image description here [/g1]

8
ответ дан Habib 19 August 2018 в 07:41
поделиться

Короче:

  • Сборка хранится как файлы .EXE или .DLL.
  • Пространство имен - это способ группировки имен типов и уменьшения вероятности столкновений имен .

Советы.

Сборка содержит набор типов (например, l'assembly System содержит много пространств имен, включенных System, System.IO, ecc). Как правило, имя сборки совпадает с именем пространства, которое оно содержит, но не всегда.

Другой пример сборок и пространств имен.

Assembly 1 (CoreAssembly.DLL)

Содержит пространства имен Namespace1.subnamespace1

Сборка 2 (ExtensionCoreAssembly.DLL)

Содержит пространства имен Namespace1.subnamespace1

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

ОПРЕДЕЛЕНИЯ.

Ассембли

Сборка представляет собой набор типов и ресурсов, которые образуют логическую единицу функциональности. Все типы в .NET Framework должны существовать в сборках; общая среда исполнения не поддерживает типы вне сборок. Каждый раз, когда вы создаете приложение Microsoft Windows®, службу Windows, библиотеку классов или другое приложение с Visual Basic .NET, вы создаете единую сборку. Каждая сборка хранится как файл .exe или .dll. Примечание. Хотя технически возможно создавать сборки, которые охватывают несколько файлов, вряд ли вы будете использовать эту технологию в большинстве ситуаций.

Пространства имен

Еще один способ организовать ваш Visual Basic .NET код осуществляется с помощью пространств имен. Пространства имен не заменяют сборки, а второй организационный метод, который дополняет сборки. Пространства имен - это способ группировки имен типов и уменьшения вероятности столкновений имен. Пространство имен может содержать как другие пространства имен, так и типы. Полное имя типа включает комбинацию пространств имен, которые содержат этот тип.

Ссылка: http://msdn.microsoft.com/en-us/library/ms973231.aspx

9
ответ дан Jakub Matczak 19 August 2018 в 07:41
поделиться

Они являются пространствами имен. Ассембли содержат более одного пространства имен. Например: System.dll содержит эти пространства имен (и более):

enter image description here [/g3]

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

GAC - глобальный кэш сборок. Согласно MSDN:

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

Так часто используемые сборки хранятся в файле GAC, и поэтому вам не нужно копировать все файлы сборки в каталог проекта, который вы ссылаетесь на ваш проект. Сборками, хранящимися в GAC, являются Strong-Named . Обычно, когда вы добавляете ссылку на сборку из вашего проекта, которая не является Strong-Named, копия вашего файла .dll будет создана в вашей папке bin\Debug. Если вы хотите, чтобы вы могли сделать свою сборку (например, проект библиотеки классов) Strong-Named.See: Как зарегистрировать сборку с сильным именем

13
ответ дан Selman Genç 19 August 2018 в 07:41
поделиться
  • 1
    Большое спасибо...:) – user3125433 3 February 2014 в 17:32
  • 2
    Итак, кто или что определяет более чем одну сборку? Я создаю проект с кучей пространств имен. Что решает, сколько сборок создается и какие пространства имен попадают под какие сборки? – eaglei22 5 January 2018 в 01:10

Пространство имен - это логическая группировка классов, принадлежащих к той же функциональности. Таким образом, System.Web и System.Data являются пространствами имен

MSDN описывают это как:

Пространства имен в основном используются в программировании на C # двумя способами. Во-первых, .NET Framework использует пространства имен для организации своих многочисленных классов. Во-вторых, объявление собственных пространств имен может помочь контролировать область имен классов и методов в более крупных проектах программирования.

namespace [/g2]

Assembly является фрагментом (предварительно скомпилированным) кодом, который может быть запущен средой выполнения .NET. Он содержит одно или несколько пространств имен. Программа .NET состоит из одной или нескольких сборок.

System.Web.dll и System.Data.dll являются сборками.

MSDN описывает это как:

Ассембли являются строительными блоками приложений .NET Framework; они образуют основную единицу развертывания, контроль версий, повторное использование, определение области действия и разрешения безопасности. Сборка представляет собой набор типов и ресурсов, которые созданы для совместной работы и образуют логическую единицу функциональности. Сборка обеспечивает общую языковую среду выполнения с информацией, которая должна быть осведомлена о реализациях типов. Для среды выполнения тип не существует вне контекста сборки.

assembly [/g3]

44
ответ дан Zaheer Ahmed 19 August 2018 в 07:41
поделиться
  • 1
    Два пути? Где второй? :) – Jugal Thakkar 5 February 2014 в 19:06
  • 2
  • 3
    Иными словами, пространство имен имеет две цели. Один из них - дать иерархическое «оглавление». для типов, так что вы можете найти или открыть их более легко. Если вы помните имя пространства имен, IntelliSense дает вам короткий список его типов. Вторая цель - управлять конфликтами имен и избегать их. Если вы можете избежать пространств имен «Система», «Microsoft», и «Windows», вы знаете , ни один из ваших типов никогда не столкнется с Microsoft. – Concrete Gannet 28 August 2015 в 01:00
Другие вопросы по тегам:

Похожие вопросы: